首页 > 其他分享 >STL-vector容器总结

STL-vector容器总结

时间:2024-09-15 22:49:32浏览次数:11  
标签:容器 STL 元素 vec4 vector vec 大小 构造函数

vector(向量)是C++标准模板库(STL)中最常用的容器之一,它提供了动态数组的功能,可以存储任意类型的元素。vector具有自动管理内存、支持随机访问、动态调整大小等优点,非常适合用于需要频繁增删元素或未知大小的数组场景。下面是对vector的总结和常见用法。


先复习一下c++中常用的构造函数,构造函数可以分为无参构造函数(默认构造函数),有参构造函数,拷贝构造函数,以及移动构造函数;

一、vector的特点

  1. 动态大小vector可以根据需要动态调整自身的大小,自动管理内存。

  2. 连续存储vector在内存中以连续的方式存储元素,支持随机访问,效率高。

  3. 自动内存管理:当元素增加超出容量时,vector会自动分配更多内存。

  4. 丰富的成员函数:提供了插入、删除、访问、遍历等一系列方便的操作函数。


二、vector的常见操作

  1. 定义和初始化

    #include <vector>
    
    // 定义一个空的int类型vector
    vector<int> vec1;
    
    // 使用初始大小和默认值
    vector<int> vec2(10);          // 大小为10,默认值为0
    vector<int> vec3(5, 1);        // 大小为5,所有元素初始化为1
    
    // 使用列表初始化
    vector<int> vec4 = {1, 2, 3, 4, 5};
    
  2. 添加元素

    vec1.push_back(10);  // 在末尾添加元素10
    vec1.emplace_back(20); // 在末尾直接构造元素20(效率更高)
    

    面试常问两者的区别

  3. 访问元素

    int value = vec4[2];     // 使用下标访问(不进行边界检查)
    int value = vec4.at(2);  // 使用at函数访问(进行边界检查)
    int front = vec4.front(); // 获取第一个元素
    int back = vec4.back();   // 获取最后一个元素
    
  4. 删除元素

    vec4.pop_back();  // 删除最后一个元素
    vec4.erase(vec4.begin() + 2); // 删除指定位置的元素
    vec4.clear();     // 清空所有元素
    
  5. 插入元素

    vec4.insert(vec4.begin() + 1, 100); // 在第二个位置插入100
    
  6. 遍历元素

    // 使用索引
    for (size_t i = 0; i < vec4.size(); ++i) {
        cout << vec4[i] << " ";
    }
    
    // 使用迭代器
    for (auto it = vec4.begin(); it != vec4.end(); ++it) {
        cout << *it << " ";
    }
    
    // 使用范围for循环(C++11及以上)
    for (const auto& val : vec4) {
        cout << val << " ";
    }
    
  7. 容量和大小

    size_t size = vec4.size();     // 获取元素数量
    size_t capacity = vec4.capacity(); // 获取当前容量
    bool empty = vec4.empty();     // 判断是否为空
    
    vec4.reserve(100); // 预留空间,避免频繁分配内存
    vec4.shrink_to_fit(); // 释放多余的内存
    

  1. 容量和大小的调整

    resize函数,调整vector元素的大小;

    #include <vector>
    #include <iostream>
    int main() {
        std::vector<int> vec = {1, 2, 3};
        // 将大小调整为 5,新增元素默认初始化为 0(int 类型)
        vec.resize(5);
        // vec 现在是 {1, 2, 3, 0, 0}
    
        // 将大小缩小为 2,最后两个元素被删除
        vec.resize(2);
        // vec 现在是 {1, 2}
        return 0;
    }
    

    reserve()函数,改变容量capcity,即预先分配的内存大小。

    #include <vector>
    #include <iostream>
    int main() {
        std::vector<int> vec;
        // 预留容量为 10,不改变当前的大小
        vec.reserve(10);
        std::cout << "Capacity: " << vec.capacity() << ", Size: " << vec.size() << std::endl;
        // 输出: Capacity: 10, Size: 0
        // 添加元素后,大小增加,容量不变
        vec.push_back(1);
        std::cout << "Capacity: " << vec.capacity() << ", Size: " << vec.size() << std::endl;
        // 输出: Capacity: 10, Size: 1
        return 0;
    }
    

三、在示例代码中的应用

在之前提供的岛屿数量的算法中,vector被用于表示二维网格:

vector<vector<char>> grid;
  • 表示二维数组vector可以嵌套,形成二维甚至多维数组,方便地表示矩阵或网格。

  • 动态调整大小:在处理未知大小的网格时,vector能够根据输入的数据动态调整大小,无需提前指定固定的数组大小。

  • 方便的访问和修改:通过grid[i][j]的方式,可以方便地访问和修改网格中的元素。


四、注意事项

  1. 效率考虑:频繁插入或删除操作,尽量在末尾进行,避免移动大量元素。如果需要在中间进行频繁插入删除,可以考虑使用listdeque

  2. 边界检查:使用operator[]访问元素时,不进行边界检查,可能导致越界访问。为了安全,建议使用at()函数。

  3. 内存管理vector会自动管理内存,但有时可能会占用比实际需要更多的内存,可以使用shrink_to_fit()来释放未使用的容量。


五、常用成员函数

  • 构造函数

    vector();                             // 默认构造函数
    vector(size_type n);                  // 指定大小,默认值初始化
    vector(size_type n, const T& value);  // 指定大小和初始值
    vector(const vector& other);          // 拷贝构造函数
    vector(vector&& other);               // 移动构造函数
    
  • 赋值操作

    vec.assign(n, value);                 // 赋值n个value
    vec.assign(first, last);              // 赋值迭代器范围内的值
    vec = other_vec;                      // 赋值操作符
    
  • 元素访问

    vec[i];           // 访问第i个元素
    vec.at(i);        // 访问第i个元素,带边界检查
    vec.front();      // 第一个元素
    vec.back();       // 最后一个元素
    vec.data();       // 返回指向数组首元素的指针
    
  • 修改容器

    vec.push_back(value);    // 在末尾添加元素
    vec.pop_back();          // 删除末尾元素
    vec.insert(pos, value);  // 在指定位置插入元素
    vec.erase(pos);          // 删除指定位置的元素
    vec.clear();             // 清空所有元素
    vec.resize(n);           // 调整大小为n
    vec.reserve(n);          // 预留容量为n
    
  • 容量相关

    vec.size();              // 返回元素数量
    vec.capacity();          // 返回当前容量
    vec.empty();             // 判断是否为空
    vec.max_size();          // 返回最大可能存储的元素数量
    vec.shrink_to_fit();     // 释放未使用的内存
    
  • 迭代器

    vec.begin();             // 指向第一个元素的迭代器
    vec.end();               // 指向最后一个元素之后的迭代器
    vec.rbegin();            // 反向迭代器,指向最后一个元素
    vec.rend();              // 反向迭代器,指向第一个元素之前
    

六、vector与数组的区别

  • 大小可变vector的大小可以动态变化,而数组的大小固定。

  • 类型安全vector是模板类,可以存储任意类型的元素,并且支持类型检查。

  • 功能丰富vector提供了大量成员函数,支持各种操作。

  • 内存连续:与数组一样,vector在内存中也是连续存储,支持高效的随机访问。


七、总结

vector是C++中功能强大且常用的容器,适用于需要动态数组的场景。在使用vector时,应注意效率和安全性,合理地选择成员函数和操作方式。通过熟练掌握vector的用法,可以大大提高编程效率和代码质量。


标签:容器,STL,元素,vec4,vector,vec,大小,构造函数
From: https://blog.csdn.net/qq_45993770/article/details/142281080

相关文章

  • Docker-compose:管理多个容器
    170.Docker-compose容器编排Docker-Compose是Docker公司推出的一个开源工具软件,可以管理多个Docker容器组成一个应用。用户需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器(或者说能实现对Dock......
  • C++string容器
    string容器基本概念本质:string是C++风格的字符串,而string本质上是一个类string和char*区别:char*是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器特点:string类内部封装了很多成员方法例如:查找find,拷贝copy,删除delete替换replac......
  • windows C++ 并行编程-并行容器和对象
    并行模式库(PPL)包括几个容器和对象,这些容器和对象提供对其元素的线程安全访问。并发容器提供对最重要操作的并发安全访问。在这里,并发安全意味着指针或迭代器始终有效。它不保证元素初始化或特定的遍历顺序。这些容器的功能与C++标准库提供的功能类似。例如,concurren......
  • docker安装prometheus+Granfan并监控容器
    docker安装普罗米修斯+Granfan并监控容器一、基本概念​1、之间的关系​prometheus与grafana之间是相辅相成的关系。作为完美的分布式监控系统的Prometheus,就想布加迪威龙一样示例和动力强劲。在猛的车也少不了仪表盘来观察。于是优雅的可视化平台Grafana出现......
  • 容器为created状态没有日志问题排查
    容器处于created状态且没有日志,通常意味着容器已经被成功创建,但尚未启动。以下是可能的原因及排查步骤:1.检查容器状态你可以使用以下命令确认容器的状态:dockerps-a这将列出所有容器,查看是否显示为created。2.启动容器如果容器处于created状态,可能还没有启动。你可......
  • python容器四之字典
    文章目录1.字典介绍2.使用字典3.字典的常见操作3.1添加元素3.2删除元素3.3修改元素3.4查找元素4.字典遍历方法4.1遍历字典元素5.公共运算符6.公共方法1.字典介绍先来看看现实生活中的字典。我们知道,可以应用字典来查找汉字。在这里插入图片描述接着......
  • Halo 开发者指南——容器私有化部署
    华为云SWR私有化部署镜像构建dockerbuild-thalo-dev/halo:2.20.0.上传镜像镜像标签sudodockertag{镜像名称}:{版本名称}swr.cn-south-1.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}sudodockertaghalo-dev/halo:2.20.0swr.cn-south-1.myhuaweicloud.c......
  • 天梯赛(常用STL函数)+ 常见算法
    0.(森森美图)判断一个点x3,y3在一条直线(由x1,y1和x2,y2组成)的哪一边若(y2-y3)/(x2-x3)-(y1-y3)/(x1-x3)>0逆时针方向否则顺时针方向1.vectorvector<node>ve;//定义ve.insert(ve.begin()+i,k);//中间插入ve.insert(ve.begin()+i,num,key);ve.erase(ve.begin()+i);//删......
  • 【鸿蒙应用开发】常见的容器组件:ColumnSplit、RowSplit和Flex
    上一章已经了解了Column和Row的一些属性,以下是几个案例:设置子组件水平方向的间距为:5@Entry@Preview@ComponentstructIndex{@Statemessage:string='Hello鸿蒙';controller:webview.WebviewController=newwebview.WebviewController();build(){Column(......
  • 鸿蒙应用开发的容器组件——Column和Row
    在鸿蒙(HarmonyOS)开发中,Column和Row是两种非常基础的布局组件,它们分别用于在垂直方向和水平方向上排列子组件。这些组件使得开发者能够轻松地构建出结构清晰、布局合理的用户界面。下面将详细介绍这两个组件的属性以及如何使用它们。Column和Row是常用的容器组件之一。Column是......