std::vector
是 C++ 标准模板库(STL)中的一个序列容器,类似于动态数组。它可以根据需要自动调整大小,提供了灵活的内存管理和丰富的操作接口。以下是std::vector
的详细用法,包括基本操作、迭代器、容量管理、元素访问等。
要使用 std::vector
,需要包含头文件
:
#include
std::vector
可以存储任何类型的元素。以下是一些常见的定义和初始化方式:
默认构造
std::vector vec; // 定义一个空的 int 类型的 vector
指定大小
std::vector vec(10); // 定义一个大小为 10 的 vector,所有元素初始化为 0
std::vector vec(10, 1); // 定义一个大小为 10 的 vector,所有元素初始化为 1
从数组初始化
int arr[] = {1, 2, 3, 4, 5};
std::vector vec(arr, arr + sizeof(arr) / sizeof(arr[0])); // 从数组初始化
从另一个容器初始化
std::vector vec1 = {1, 2, 3, 4, 5};
std::vector vec2(vec1.begin(), vec1.end()); // 从另一个 vector 初始化
使用列表初始化
std::vector vec = {1, 2, 3, 4, 5}; // 使用列表初始化
std::vector
提供了丰富的操作接口,用于添加、删除、访问和修改元素。
添加元素
vec.push_back(6); // 在 vector 的末尾添加一个元素
vec.insert(vec.begin() + 2, 10); // 在指定位置插入一个元素
删除元素
vec.pop_back(); // 删除 vector 的最后一个元素
vec.erase(vec.begin() + 2); // 删除指定位置的元素
清空所有元素
vec.clear(); // 清空 vector 中的所有元素
std::vector
提供了迭代器,用于遍历容器中的元素。
使用迭代器遍历
for (std::vector::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
使用范围 for 循环
for (int value : vec) {
std::cout << value << " ";
}
std::cout << std::endl;
std::vector
提供了一些方法来管理其容量和大小。
获取大小
size_t size = vec.size(); // 获取 vector 的当前大小
size_t capacity = vec.capacity(); // 获取 vector 的当前容量
改变大小
vec.resize(15); // 改变 vector 的大小,新元素默认初始化为 0
vec.resize(15, 1); // 改变 vector 的大小,新元素初始化为 1
预分配内存
vec.reserve(20); // 预分配内存,避免多次重新分配
std::vector
提供了多种方式访问其元素。
使用下标访问
int value = vec[0]; // 访问第一个元素
vec[0] = 10; // 修改第一个元素
使用 at
方法访问
int value = vec.at(0); // 访问第一个元素,范围检查
vec.at(0) = 10; // 修改第一个元素,范围检查
访问首尾元素
int first = vec.front(); // 访问第一个元素
int last = vec.back(); // 访问最后一个元素
std::vector
可以与 STL 算法一起使用,例如查找和排序。
查找元素
auto it = std::find(vec.begin(), vec.end(), 10); // 查找值为 10 的元素
if (it != vec.end()) {
std::cout << "Found: " << *it << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
排序
std::sort(vec.begin(), vec.end()); // 对 vector 进行排序
以下是一个完整的示例代码,展示了 std::vector
的基本用法:
#include
#include
#include // 用于 std::find 和 std::sort
int main() {
std::vector vec = {5, 2, 9, 1, 5, 6};
// 添加元素
vec.push_back(10);
vec.insert(vec.begin() + 2, 20);
// 删除元素
vec.pop_back();
vec.erase(vec.begin() + 2);
// 查找元素
auto it = std::find(vec.begin(), vec.end(), 9);
if (it != vec.end()) {
std::cout << "Found: " << *it << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
// 排序
std::sort(vec.begin(), vec.end());
// 遍历并输出
for (int value : vec) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
动态内存管理:
std::vector
会自动管理内存,但在频繁插入和删除元素时,可能会导致多次内存重新分配。使用reserve
方法可以预先分配足够的内存,提高性能。范围检查:使用
at
方法访问元素时,会进行范围检查,如果索引超出范围,会抛出std::out_of_range
异常。使用下标访问时,不会进行范围检查,可能会导致未定义行为。迭代器失效:在向
std::vector
中插入或删除元素时,可能会导致迭代器失效。如果需要在迭代过程中修改容器,建议使用下标访问或重新获取迭代器。
std::vector
是一个非常强大且灵活的容器,适用于各种需要动态数组的场景。
std::vector
的二维使用方法本质上是通过嵌套std::vector
来实现的。二维std::vector
可以看作是一个动态数组的数组,类似于二维数组。以下是二维std::vector
的定义、初始化、访问和操作的详细用法。
默认构造
std::vector> vec2D; // 定义一个空的二维 vector
指定大小
std::vector> vec2D(3, std::vector(4));
// 定义一个 3x4 的二维 vector,所有元素初始化为 0
使用列表初始化
std::vector> vec2D = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}; // 使用列表初始化
使用下标访问
int value = vec2D[0][1]; // 访问第 1 行第 2 列的元素
vec2D[0][1] = 10; // 修改第 1 行第 2 列的元素
使用 at
方法访问
int value = vec2D.at(0).at(1); // 访问第 1 行第 2 列的元素,范围检查
vec2D.at(0).at(1) = 10; // 修改第 1 行第 2 列的元素,范围检查
使用嵌套循环
for (size_t i = 0; i < vec2D.size(); ++i) {
for (size_t j = 0; j < vec2D[i].size(); ++j) {
std::cout << vec2D[i][j] << " ";
}
std::cout << std::endl;
}
使用范围 for 循环
for (const auto& row : vec2D) {
for (int value : row) {
std::cout << value << " ";
}
std::cout << std::endl;
}
添加行
vec2D.push_back({10, 20, 30}); // 在二维 vector 的末尾添加一行
删除行
vec2D.pop_back(); // 删除二维 vector 的最后一行
添加列
for (auto& row : vec2D) {
row.push_back(100); // 在每一行的末尾添加一个元素
}
删除列
for (auto& row : vec2D) {
row.pop_back(); // 删除每一行的最后一个元素
}
改变行数
vec2D.resize(5, std::vector(3)); // 改变二维 vector 的行数为 5,每行大小为 3
改变列数
for (auto& row : vec2D) {
row.resize(4); // 改变每一行的大小为 4
}
以下是一个完整的示例代码,展示了二维 std::vector
的基本用法:
#include
#include
int main() {
// 定义一个 3x4 的二维 vector,所有元素初始化为 0
std::vector> vec2D(3, std::vector(4, 0));
// 修改元素
vec2D[0][1] = 10;
vec2D[1][2] = 20;
// 添加一行
vec2D.push_back({1, 2, 3, 4});
// 添加一列
for (auto& row : vec2D) {
row.push_back(100);
}
// 遍历并输出
for (const auto& row : vec2D) {
for (int value : row) {
std::cout << value << " ";
}
std::cout << std::endl;
}
return 0;
}
动态内存管理:二维
std::vector
会自动管理内存,但在频繁插入和删除元素时,可能会导致多次内存重新分配。使用reserve
方法可以预先分配足够的内存,提高性能。范围检查:使用
at
方法访问元素时,会进行范围检查,如果索引超出范围,会抛出std::out_of_range
异常。使用下标访问时,不会进行范围检查,可能会导致未定义行为。迭代器失效:在向二维
std::vector
中插入或删除元素时,可能会导致迭代器失效。如果需要在迭代过程中修改容器,建议使用下标访问或重新获取迭代器。
二维 std::vector
是一个非常强大且灵活的容器,适用于各种需要动态二维数组的场景。通过合理使用其提供的方法和接口,可以高效地管理数据。