西嘎嘎学习 - C++vector容器 - Day 7
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 个整数的 vectorstd::vector<int> numbers = {10, 20, 30, 40, 50};// 2. 输出 vector 的大小和内容std::cout << "初始 vector 的大小是: " << numbers.size() << std::endl;std::cout << "初始 vector 的内容是: ";// 使用范围 for 循环遍历 vectorfor (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};// 使用数组的起始地址和结束地址初始化 vectorstd::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 引入的简洁遍历方式 |