std::vector
是 C++ 标准库中一个非常常用的动态数组容器。它可以存储任意数量的元素,并且提供了灵活的大小调整和对元素的快速访问。以下是 std::vector
的基本用法说明,包括常见操作和示例代码。
1. 头文件
在使用 std::vector
之前,需要包含相应的头文件:
#include <vector>
2. 定义和初始化
可以使用以下方式定义和初始化 std::vector
:
std::vector<int> vec; // 创建一个空的整数向量
std::vector<int> vec1(10); // 创建一个包含 10 个默认初始化(0)的元素的向量
std::vector<int> vec2(10, 5); // 创建一个包含 10 个元素,值为 5 的向量
std::vector<int> vec3 = {1, 2, 3, 4, 5}; // 使用初始化列表
3. 常用操作
a. 添加元素
可以使用 push_back
方法在向量末尾添加元素:
vec.push_back(1);
vec.push_back(2);
如果想在特定位置插入元素,可以使用 insert
方法:
vec.insert(vec.begin() + 1, 3); // 在索引 1 处插入 3
b. 访问元素
可以使用下标操作或 at
方法访问元素:
int first = vec[0]; // 使用下标操作
int second = vec.at(1); // 使用 at 方法
注意:at
方法会进行边界检查,若索引越界会抛出异常。
c. 删除元素
可以使用 pop_back
方法删除最后一个元素,使用 erase
方法删除特定位置的元素:
vec.pop_back(); // 删除最后一个元素
vec.erase(vec.begin() + 1); // 删除索引 1 处的元素
d. 遍历元素
可以使用范围 for 循环或迭代器遍历 std::vector
:
for (const auto& elem : vec) {std::cout << elem << " ";
}for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}
e. 获取大小和容量
可以使用 size
方法获取当前元素个数,使用 capacity
方法获取当前容量:
std::cout << "Size: " << vec.size() << std::endl;
std::cout << "Capacity: " << vec.capacity() << std::endl;
f. 清空和缩小容量
可以使用 clear
方法清空向量,使用 shrink_to_fit
方法缩小容量以适应当前大小:
vec.clear(); // 清空向量
vec.shrink_to_fit(); // 收缩容量
4. 示例代码
以下是一个完整的示例代码,演示了 std::vector
的基本用法:
#include <iostream>
#include <vector>int main() {// 创建一个整数向量并初始化std::vector<int> vec = {1, 2, 3, 4, 5};// 添加元素vec.push_back(6);vec.push_back(7);// 在索引 2 处插入元素vec.insert(vec.begin() + 2, 99);// 遍历向量std::cout << "Vector elements: ";for (const auto& elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 访问元素std::cout << "First element: " << vec.at(0) << std::endl;// 删除元素vec.pop_back(); // 删除最后一个元素vec.erase(vec.begin() + 1); // 删除索引 1 的元素// 输出大小和容量std::cout << "Size after modifications: " << vec.size() << std::endl;std::cout << "Capacity after modifications: " << vec.capacity() << std::endl;// 清空向量vec.clear();std::cout << "Size after clearing: " << vec.size() << std::endl;return 0;
}
5. 注意事项
-
动态大小:
std::vector
是动态数组,能够自动调整大小,但每次扩展时可能会导致重新分配内存。如果频繁地在末尾添加元素,可能会导致性能下降,特别是在大容量的情况下。可以使用reserve()
方法预先分配足够的空间以提高性能。std::vector<int> vec; vec.reserve(100); // 预先分配空间以容纳100个元素
-
指针和迭代器:在对
std::vector
进行添加或删除操作后,所有指向其元素的指针和迭代器可能会失效。因此,在进行这些操作后,应谨慎使用指针和迭代器。 -
内存管理:
std::vector
自动管理内存,但是在使用std::vector
存储指针时,用户需要手动管理指针所指向的对象的生命周期,以避免内存泄漏。