C++ vector容器完全指南

好的!以下是关于C++中vector容器的详细指南:


一、vector基础

vector是C++标准模板库(STL)提供的动态数组,支持自动扩容和随机访问。其核心特性包括:

  1. 连续内存存储:元素在内存中连续分布,支持指针算术。
  2. 动态大小:无需预先指定长度,可运行时调整。
  3. 时间复杂度
    • 随机访问:O(1)
    • 尾部插入/删除:均摊O(1)
    • 中间插入/删除:O(n)

二、基本操作

1. 初始化
cpp 复制代码
#include <vector>
using namespace std;

// 空vector
vector<int> vec1; 

// 指定长度和初始值
vector<int> vec2(5, 0); // {0, 0, 0, 0, 0}

// 从数组初始化
int arr[] = {1, 2, 3};
vector<int> vec3(arr, arr + 3); // {1, 2, 3}

// 列表初始化(C++11)
vector<int> vec4 = {4, 5, 6};
2. 常用方法
方法 功能 示例
push_back() 尾部添加元素 vec.push_back(10);
pop_back() 删除尾部元素 vec.pop_back();
size() 返回元素数量 int len = vec.size();
empty() 判断是否为空 if (vec.empty()) {...}
clear() 清空所有元素 vec.clear();
resize(n) 调整容器大小 vec.resize(10);

三、内存管理与性能

1. 扩容机制
  • 当容量不足时,vector会分配新内存(通常为原大小的2倍),复制元素并释放旧内存。

  • 可通过capacity()查看当前容量:

    cpp 复制代码
    vector<int> vec;
    cout << "Capacity: " << vec.capacity(); // 初始为0
    vec.push_back(1); // 容量变为1
2. 预分配内存

使用reserve()避免频繁扩容:

cpp 复制代码
vector<int> vec;
vec.reserve(100); // 预分配100个元素空间
// 后续插入100个元素不会触发扩容

四、迭代器与访问

1. 迭代器遍历
cpp 复制代码
vector<int> vec = {10, 20, 30};
for (auto it = vec.begin(); it != vec.end(); ++it) {
    cout << *it << " "; // 10 20 30
}
2. 随机访问
cpp 复制代码
cout << vec[0];    // 索引访问(不检查边界)
cout << vec.at(1); // 边界检查访问,越界抛出异常

五、高效操作技巧

1. 使用emplace_back替代push_back
  • emplace_back直接构造元素,避免临时对象拷贝:

    cpp 复制代码
    vector<pair<int, string>> vec;
    vec.emplace_back(1, "Alice"); // 直接构造pair
2. 避免在循环中插入

以下操作可能多次触发扩容:

cpp 复制代码
// 低效写法
for (int i = 0; i < 10000; i++) {
    vec.push_back(i); // 可能多次扩容
}

// 高效写法
vec.reserve(10000);
for (int i = 0; i < 10000; i++) {
    vec.push_back(i);
}

六、删除元素

1. erase方法

删除指定位置元素:

cpp 复制代码
vector<int> vec = {1, 2, 3, 4};
auto it = vec.begin() + 2;
vec.erase(it); // 删除第三个元素(索引2)
2. 删除特定值(erase + remove
cpp 复制代码
vector<int> vec = {1, 2, 2, 3, 4};
vec.erase(remove(vec.begin(), vec.end(), 2), vec.end());
// 结果:{1, 3, 4}

七、应用场景

  1. 替代原生数组:更安全、功能更强。
  2. 动态数据集合:如实时接收传感器数据。
  3. 算法实现:如图论中的邻接表存储。

八、注意事项

  1. 迭代器失效:插入/删除操作可能使迭代器失效。
  2. 线程安全:多线程环境下需自行加锁。
  3. 存储大对象 :建议存储指针或使用std::move转移所有权。

通过灵活运用vector,可显著提升C++程序的开发效率和性能。

相关推荐
liulilittle1 天前
XDP VNP虚拟以太网关(章节:三)
网络·c++·网络协议·信息与通信·通信·xdp
leiming61 天前
c++ find_if 算法
开发语言·c++·算法
yuanmenghao1 天前
自动驾驶中间件iceoryx - 内存与 Chunk 管理(三)
数据结构·c++·算法·链表·中间件·自动驾驶
_OP_CHEN1 天前
【算法基础篇】(四十三)数论之费马小定理深度解析:从同余性质到乘法逆元
c++·算法·蓝桥杯·数论·acm/icpc
茶猫_1 天前
C++学习记录-旧题新做-链表求和
数据结构·c++·学习·算法·leetcode·链表
王老师青少年编程1 天前
信奥赛C++提高组csp-s之并查集(案例实践)1
数据结构·c++·并查集·csp·信奥赛·csp-s·提高组
谢娘蓝桥1 天前
adi sharc c/C++ 语言指令优化
开发语言·c++
郑泰科技1 天前
fmm(快速地图匹配)实践:Unknown toolset: vcunk的解决方案
c++·windows·交通物流
a3535413821 天前
设计模式-原型模式
开发语言·c++