C++类:容器
一、 std::vector 类
std::vector 是 C++ STL 中最常用的容器之一,它是一个动态数组,能够自动管理内存,支持快速随机访问,是处理序列数据的理想选择。
- 动态大小:可在运行时自动扩容或缩容,无需预先指定固定大小
- 连续内存:元素存储在连续的内存空间中,支持快速随机访问
- 高效操作:尾部插入/删除效率高(O(1)),中间插入/删除效率低(O(n))
- 模板类:可存储任意类型的数据(基本类型、自定义类型等)
1.1 基本用法
1. 头文件与命名空间
#include <vector> // 必须包含的头文件
using namespace std; // 或使用 std::vector
2. 声明与初始化
// 声明一个存储int类型的vector
vector<int> vec1;
// 初始化包含5个元素,每个元素都是0
vector<int> vec2(5, 0);
// 用初始化列表初始化
vector<int> vec3 = {1, 2, 3, 4, 5};
// 从数组初始化
int arr[] = {10, 20, 30};
vector<int> vec4(arr, arr + 3); // 从arr[0]到arr[2]
// 复制另一个vector
vector<int> vec5(vec3); // vec5与vec3内容相同
3. 常用成员函数
| 函数 | 功能 | 示例 |
|---|---|---|
size() | 返回元素个数 | int n = vec.size(); |
empty() | 判断是否为空 | if (vec.empty()) { ... } |
push_back() | 在尾部添加元素 | vec.push_back(6); |
pop_back() | 删除尾部元素 | vec.pop_back(); |
clear() | 清空所有元素 | vec.clear(); |
resize(n) | 调整大小为n | vec.resize(10); |
reserve(n) | 预留容量(不改变size) | vec.reserve(100); |
at(i) | 访问索引i的元素(带越界检查) | int x = vec.at(0); |
operator[] | 访问索引i的元素(无越界检查) | int y = vec[1]; |
begin()/end() | 返回首尾迭代器 | 用于遍历 |
front() | 返回第一个元素 | int first = vec.front(); |
back() | 返回最后一个元素 | int last = vec.back(); |
data() | 返回指向底层数组的指针 | int* ptr = vec.data(); |
4. 遍历方式
vector<int> vec = {1, 2, 3, 4, 5};
// 1. 下标访问
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
// 2. 迭代器
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
// 3. C++11范围for循环
for (int num : vec) {
cout << num << " ";
}
5. 插入与删除
vector<int> vec = {1, 2, 3};
// 在索引1位置插入元素10
vec.insert(vec.begin() + 1, 10); // 结果: {1, 10, 2, 3}
// 在末尾插入另一个vector的元素
vector<int> add = {4, 5};
vec.insert(vec.end(), add.begin(), add.end()); // 结果: {1, 10, 2, 3, 4, 5}
// 删除索引2的元素
vec.erase(vec.begin() + 2); // 结果: {1, 10, 3, 4, 5}
// 删除一个范围的元素
vec.erase(vec.begin() + 1, vec.begin() + 3); // 结果: {1, 4, 5}
1.2 使用注意事项
-
迭代器失效:
- 插入元素可能导致迭代器失效(尤其是触发扩容时)
- 删除元素会导致被删除元素之后的迭代器失效
-
性能优化:
- 使用
reserve(n)预先分配足够的容量,避免频繁扩容 - 尽量在尾部操作元素(
push_back/pop_back),效率更高
- 使用
-
存储自定义类型:
struct Person { string name; int age; }; vector<Person> people; people.push_back({"Alice", 25});
1.3 与数组的对比
| 特性 | std::vector | 普通数组 |
|---|---|---|
| 大小 | 动态可变 | 固定不变 |
| 内存管理 | 自动管理 | 手动管理 |
| 越界检查 | at() 提供检查 | 无检查 |
| 功能 | 丰富的成员函数 | 仅基本访问 |
1.4 示例
std::vector 是一个功能强大且灵活的动态数组容器,适用于大多数需要存储序列数据的场景。它结合了数组的高效访问和链表的动态大小优势,是 C++ 程序员必备的工具之一。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
// 1. 初始化vector
std::vector<int> numbers = {5, 2, 8, 1, 9, 3};
std::cout << "初始vector: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 2. 基本操作
std::cout << "大小: " << numbers.size() << std::endl;
std::cout << "第一个元素: " << numbers.front() << std::endl;
std::cout << "最后一个元素: " << numbers.back() << std::endl;
// 3. 修改元素
numbers.push_back(7); // 添加到尾部
numbers[2] = 10; // 修改索引2的元素
std::cout << "修改后: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 4. 排序
std::sort(numbers.begin(), numbers.end());
std::cout << "排序后: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 5. 插入和删除
numbers.insert(numbers.begin() + 2, 6); // 在索引2插入6
numbers.erase(numbers.end() - 2); // 删除倒数第二个元素
std::cout << "插入删除后: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
以上代码展示了 std::vector 的常用操作,包括初始化、访问元素、修改内容、排序以及插入删除等操作。

1万+

被折叠的 条评论
为什么被折叠?



