C++ 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。
vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。
与 C++ 数组相比,vector 具有更多的灵活性和功能,使其成为 C++ 中常用的数据结构之一。
vector 是 C++ 标准模板库(STL)的一部分,提供了灵活的接口和高效的操作。
基本特性:
- 动态大小:
vector
的大小可以根据需要自动增长和缩小。 - 连续存储:
vector
中的元素在内存中是连续存储的,这使得访问元素非常快速。 - 可迭代:
vector
可以被迭代,你可以使用循环(如for
循环)来访问它的元素。 - 元素类型:
vector
可以存储任何类型的元素,包括内置类型、对象、指针等。
使用场景:
- 当你需要一个可以动态增长和缩小的数组时。
- 当你需要频繁地在序列的末尾添加或移除元素时。
- 当你需要一个可以高效随机访问元素的容器时。
1. 头文件
#include <vector>
2. 声明和初始化
std::vector
可以通过多种方式声明和初始化。
2.1 默认初始化
std::vector<int> vec; // 创建一个空的 int 类型 vector
2.2 指定大小初始化
std::vector<int> vec(10); // 创建一个包含 10 个元素的 vector,每个元素初始化为 0
2.3 指定大小和初始值
std::vector<int> vec(10, 5); // 创建一个包含 10 个元素的 vector,每个元素初始化为 5
2.4 使用初始化列表
std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用初始化列表创建 vector
2.5 拷贝初始化
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2(vec1); // 使用另一个 vector 初始化
3. 常用操作
3.1 访问元素
-
使用
[]
或at()
访问元素:std::vector<int> vec = {1, 2, 3, 4, 5}; int first = vec[0]; // 访问第一个元素 int second = vec.at(1); // 访问第二个元素
[]
不会检查下标是否越界,访问越界时行为未定义。at()
会检查下标是否越界,如果越界会抛出std::out_of_range
异常。-
使用
front()
和back()
访问首尾元素:
int first = vec.front(); // 访问第一个元素
int last = vec.back(); // 访问最后一个元素
3.2 添加元素
使用 push_back()
在末尾添加元素:
vec.push_back(6); // 在末尾添加元素 6
使用 emplace_back()
在末尾构造元素(避免不必要的拷贝):
vec.emplace_back(6); // 在末尾构造元素 6
使用 insert()
在指定位置插入元素:
vec.insert(vec.begin() + 2, 10); // 在第 3 个位置插入 10
3.3 删除元素
使用 pop_back()
删除末尾元素:
vec.pop_back(); // 删除最后一个元素
使用 erase()
删除指定位置的元素:
vec.erase(vec.begin() + 2); // 删除第 3 个元素
使用 clear()
清空所有元素:
vec.clear(); // 清空 vector
3.4 获取大小和容量
使用 size()
获取元素个数:
int size = vec.size(); // 获取元素个数
使用 capacity()
获取当前容量:
int cap = vec.capacity(); // 获取当前容量
使用 empty()
判断是否为空
if (vec.empty()) {
std::cout << "Vector is empty!" << std::endl;
}
3.5 调整大小
使用 resize()
调整大小:
vec.resize(20); // 将 vector 大小调整为 20,多出的元素初始化为 0
vec.resize(20, 5); // 将 vector 大小调整为 20,多出的元素初始化为 5
使用 reserve()
预留空间(避免频繁扩容):
vec.reserve(100); // 预留 100 个元素的空间
3.6 遍历元素
使用下标遍历:
for (size_t i = 0; i < vec.size(); i++) {
std::cout << vec[i] << " ";
}
使用迭代器遍历:
for (auto it = vec.begin(); it != vec.end(); it++) {
std::cout << *it << " ";
}
使用范围 for 循环遍历:
for (int val : vec) {
std::cout << val << " ";
}
4. 动态扩容
std::vector
在元素数量超过当前容量时会自动扩容,通常是当前容量的 2 倍。扩容会导致重新分配内存和元素拷贝,因此频繁扩容会影响性能。可以通过 reserve()
提前预留空间来避免频繁扩容。
5. 示例代码
以下是一个完整的示例代码,展示了 std::vector
的常见用法:
#include <iostream>
#include <vector>
int main() {
// 初始化
std::vector<int> vec = {1, 2, 3, 4, 5};
// 添加元素
vec.push_back(6);
vec.emplace_back(7);
// 访问元素
std::cout << "First element: " << vec.front() << std::endl;
std::cout << "Last element: " << vec.back() << std::endl;
// 遍历元素
std::cout << "Elements: ";
for (int val : vec) {
std::cout << val << " ";
}
std::cout << std::endl;
// 删除元素
vec.pop_back();
vec.erase(vec.begin() + 2);
// 调整大小
vec.resize(10, 0);
// 输出大小和容量
std::cout << "Size: " << vec.size() << std::endl;
std::cout << "Capacity: " << vec.capacity() << std::endl;
return 0;
}