在C++中,`std::vector`如何使用
·
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; // 迭代器已失效!
// ✅ 删除后不要使用已删除元素的迭代器
更多推荐




所有评论(0)