std::vector 是 C++ 标准库中最常用的动态数组容器。以下是详细讲解:


📌 基本概念

std::vector 是 C++ 标准模板库(STL)中的动态数组,它能够:

  • 自动管理内存
  • 动态增长和收缩
  • 提供随机访问迭代器

📌 声明和初始化

// 基本声明
std::vector<int> numbers;

// 指定大小初始化(所有元素默认为0)
std::vector<int> numbers(10);

// 指定大小和初始值
std::vector<int> numbers(10, 5);  // 10个元素,都是5

// 列表初始化
std::vector<int> numbers = {1, 2, 3, 4, 5};

// 从数组初始化
int arr[] = {1, 2, 3, 4, 5};
std::vector<int> numbers(arr, arr + 5);  // [起始迭代器, 结束迭代器)

// 拷贝构造
std::vector<int> numbers2(numbers);

📌 常用操作方法

方法 说明 示例
push_back(val) 在末尾添加元素 vec.push_back(10);
pop_back() 移除末尾元素 vec.pop_back();
emplace_back() 在末尾原地构造元素(更高效) vec.emplace_back(10);
insert(pos, val) 在指定位置插入 vec.insert(vec.begin()+2, 99);
erase(pos) 删除指定位置元素 vec.erase(vec.begin()+1);
clear() 清空所有元素 vec.clear();
size() 返回元素数量 int n = vec.size();
empty() 判断是否为空 if(vec.empty())
resize(n) 改变大小 vec.resize(20);
reserve(n) 预分配内存 vec.reserve(100);
capacity() 返回已分配内存能容纳的元素数 int cap = vec.capacity();

📌 元素访问

std::vector<int> vec = {10, 20, 30, 40, 50};

// 下标访问(不检查边界)
int first = vec[0];      // 10
int third = vec[2];      // 30

// at() 方法(会检查边界,越界抛异常)
int first = vec.at(0);   // 10

// front() 和 back()
int first = vec.front(); // 10
int last = vec.back();    // 50

// data() 返回底层数组指针
int* ptr = vec.data();

📌 迭代器

std::vector<int> vec = {10, 20, 30, 40, 50};

// 遍历方式1:迭代器
for(auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
}

// 遍历方式2:范围for循环(推荐)
for(int val : vec) {
    std::cout << val << " ";
}

// 反向遍历
for(auto it = vec.rbegin(); it != vec.rend(); ++it) {
    std::cout << *it << " ";
}

📌 性能相关tips

// 1. 预分配内存避免多次扩容
std::vector<int> vec;
vec.reserve(1000);  // 预先分配1000个元素的空间

// 2. 使用 emplace_back 替代 push_back(避免拷贝)
struct Point { int x, y; };
std::vector<Point> points;
points.emplace_back(10, 20);  // 直接构造,比 push_back(Point{10,20}) 更高效

// 3. 使用 swap 技巧释放内存
std::vector<int>().swap(vec);  // 清空vec并释放内存

// 4. 避免在循环中频繁调用 size()
for(int i = 0; i < vec.size(); ++i)  // 每次循环都调用size()
for(int i = 0, n = vec.size(); i < n; ++i)  // 只调用一次

📌 常见错误

// ❌ 越界访问(不抛异常,可能崩溃)
std::vector<int> vec = {1, 2, 3};
int val = vec[10];  // 未定义行为!

// ✅ 使用 at() 会抛异常
int val = vec.at(10);  // 抛出 std::out_of_range 异常

// ❌ 删除元素后使用失效的引用
auto it = vec.begin();
vec.erase(it);
int val = *it;  // 迭代器已失效!

// ✅ 删除后不要使用已删除元素的迭代器

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐