1 vector 是什么
vector 是一个顺序容器,它内部使用连续的内存空间来存储元素。
可以像使用数组一样访问 vector 中的元素。
可以自动扩展大小。
2 vector 的基本用法
(1)引入头文件
#include <vector>
(2)定义 vector
std::vector<int> numbers; // 定义一个存储 int 类型的 vector
std::vector 是 vector 的命名空间
int 是 vector 中存储的数据类型。
numbers 是 vector 的变量名。
3 常用操作
(1)添加元素
numbers.push_back(10); // 在 vector 末尾添加一个元素
(2)访问元素
int first = numbers[0]; // 使用下标访问元素(不检查越界)
int second = numbers.at(1); // 使用 at() 方法访问元素(会检查越界)
(3)获取 vector 的大小
int size = numbers.size(); //获取当前元素个数
(4)判断是否为空
if (numbers.empty())
{
std::cout << "Vector 是空的" << std::endl;
}
(5)清空 vector
numbers.clear(); // 清除所有元素
(6)删除最后一个元素
numbers.pop_back(); //删除最后一个元素
4 初始化 vector
(1)默认初始化(空 vector)
std::vector<int> vec1; // 空 vector
(2)指定大小
std::vector<int> vec2(5); //创建一个包含 5 个 0 的 vector
(3)指定大小和初始值
std::vector<int> vec3(5,10); // 创建一个包含 5 个 10 的 vector
(4)用数组初始化
int arr[] = {1,2,3,4,5};
std::vector<int> vec4(arr,arr + 5); // 用数组初始化 vector
5 遍历 vector
(1)使用下标遍历
for (size_t i = 0; i < vec.size(); ++i)
{
std::cout << vec[i] << " ";
}
(2)使用迭代器遍历
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++i)
{
std::cout << *it << " " ;
}
(3)使用范围 for 循环 (C++ 11 及以上)
for (int num : vec)
{
std::cout << num << " " ;
}
6 vector 的性能特点
1.随机访问快:因为 vector 是连续内存,所以随机访问元素非常快。
2.尾插 / 尾删 快:push_back 和 pop_back 是常数时间操作。
3.中间插入 / 删除 慢:因为需要移动元素,时间复杂度是 O(n)。
4.自动扩容:当 vector 容量不足时,会自动分配更大的内存空间,并复制原有元素。
7 完整示例代码
#include <iostream>
#include <vector> // 引入 vector 头文件
int main() {
// 1. 定义并初始化一个 vector
// 使用初始化列表的方式创建一个包含 5 个整数的 vector
std::vector<int> numbers = {10, 20, 30, 40, 50};
// 2. 输出 vector 的大小和内容
std::cout << "初始 vector 的大小是: " << numbers.size() << std::endl;
std::cout << "初始 vector 的内容是: ";
// 使用范围 for 循环遍历 vector
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 3. 在 vector 末尾添加元素
// push_back() 会将元素添加到 vector 的末尾
numbers.push_back(60);
numbers.push_back(70);
std::cout << "添加元素后的 vector 内容是: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 4. 修改 vector 中的某个元素
// 使用下标访问并修改索引为 2 的元素(从 0 开始)
numbers[2] = 99;
std::cout << "修改后的 vector 内容是: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 5. 使用 at() 方法访问元素(带越界检查)
// at() 会检查索引是否越界,如果越界会抛出异常
try {
std::cout << "使用 at() 访问第 5 个元素: " << numbers.at(5) << std::endl;
} catch (const std::out_of_range& e) {
// 捕获越界异常并输出错误信息
std::cout << "越界访问错误: " << e.what() << std::endl;
}
// 6. 删除最后一个元素
// pop_back() 会删除 vector 的最后一个元素
numbers.pop_back();
std::cout << "删除最后一个元素后的 vector 内容是: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 7. 使用迭代器遍历 vector
// begin() 返回指向第一个元素的迭代器
// end() 返回指向最后一个元素之后的迭代器
std::cout << "使用迭代器遍历 vector: ";
for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
// *it 表示解引用迭代器,获取当前元素
std::cout << *it << " ";
}
std::cout << std::endl;
// 8. 使用数组初始化 vector
// 定义一个数组
int arr[] = {100, 200, 300};
// 使用数组的起始地址和结束地址初始化 vector
std::vector<int> vecFromArr(arr, arr + 3);
std::cout << "从数组初始化的 vector 内容是: ";
for (int num : vecFromArr) {
std::cout << num << " ";
}
std::cout << std::endl;
// 9. 二维 vector(vector 的 vector)
// 定义一个二维 vector,表示一个 3x3 的矩阵
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
std::cout << "二维 vector 内容是: " << std::endl;
// 外层循环遍历每一行
for (const auto& row : matrix) {
// 内层循环遍历每一行中的元素
for (int val : row) {
std::cout << val << " ";
}
std::cout << std::endl;
}
// 10. 清空 vector
// clear() 会删除 vector 中的所有元素
numbers.clear();
std::cout << "清空后的 vector 大小是: " << numbers.size() << std::endl;
return 0;
}
8 总结
功能 | 说明 |
---|---|
push_back() |
在 vector 末尾添加元素 |
pop_back() |
删除 vector 的最后一个元素 |
size() |
获取 vector 中元素的个数 |
at() |
安全访问元素(带越界检查) |
[] |
快速访问元素(不检查越界) |
clear() |
清空 vector 中的所有元素 |
empty() |
判断 vector 是否为空(未在本例中使用) |
begin() / end() |
获取迭代器,用于遍历 vector |
数组初始化 vector | 使用数组指针初始化 vector |
二维 vector | vector 的 vector,用于表示矩阵等结构 |
异常处理 | 捕获越界访问异常 |
范围 for 循环 | C++11 引入的简洁遍历方式 |