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