{“v”}
C++ Vector 容器完全指南
编程小白也能理解的动态数组知识点汇总
什么是Vector?
Vector是C++标准模板库(STL)中最常用的容器之一,可以简单理解为动态数组。
大白话解释:Vector就像一个能自动伸缩的智能数组。你不需要预先知道要存多少数据,它会根据你的需要自动调整大小。
为什么使用Vector?
- 🏆 动态大小:不像普通数组需要固定大小,vector可以随时增长或缩小
- 🔒 安全访问:提供了边界检查(使用at()方法)
- ⚡ 高效操作:在尾部添加/删除元素非常高效
- 🧩 丰富功能:内置多种实用方法(排序、查找、遍历等)
- 🧠 自动内存管理:不需要手动分配和释放内存
Vector的基本使用
1. 包含头文件
#include <vector> // 使用vector必须包含此头文件
2. 创建Vector
using namespace std; // 省略std::前缀
// 创建不同类型的vector
vector<int> nums; // 创建空的int类型vector
vector<string> names; // 创建空的string类型vector
vector<int> values(10); // 创建包含10个元素的vector,默认值为0
vector<int> prices {5, 10, 15}; // 创建并初始化vector
3. 添加元素
vector<int> vec;
// 在末尾添加元素
vec.push_back(10); // vec: [10]
vec.push_back(20); // vec: [10, 20]
vec.push_back(30); // vec: [10, 20, 30]
// 在指定位置插入元素
vec.insert(vec.begin(), 5); // 在开头插入: [5, 10, 20, 30]
vec.insert(vec.begin() + 2, 15); // 在索引2处插入: [5, 10, 15, 20, 30]
访问Vector元素
1. 使用索引访问
vector<int> vec = {10, 20, 30, 40};
// 像数组一样用[]访问
int first = vec[0]; // 10
int third = vec[2]; // 30
// 使用at()方法(带边界检查)
int last = vec.at(vec.size() – 1); // 40
// 访问第一个和最后一个元素
int front = vec.front(); // 10
int back = vec.back(); // 40
⚠️ 注意:使用[]访问时,如果索引超出范围,程序可能会崩溃或产生未定义行为。使用at()会抛出异常,更安全。
2. 遍历Vector
vector<int> numbers = {1, 2, 3, 4, 5};
// 方法1: 使用索引遍历
for (int i = 0; i < numbers.size(); i++) {
cout << numbers[i] << ” “;
}
// 方法2: 使用迭代器遍历
for (auto it = numbers.begin(); it != numbers.end(); it++) {
cout << *it << ” “;
}
// 方法3: 使用范围for循环 (C++11及以上)
for (int num : numbers) {
cout << num << ” “;
}
修改和删除元素
1. 修改元素
vector<int> nums = {10, 20, 30, 40};
nums[1] = 25; // [10, 25, 30, 40]
nums.at(2) = 35; // [10, 25, 35, 40]
2. 删除元素
vector<int> nums = {10, 20, 30, 40, 50};
// 删除最后一个元素
nums.pop_back(); // [10, 20, 30, 40]
// 删除指定位置的元素
nums.erase(nums.begin() + 1); // 删除索引1处的元素: [10, 30, 40]
// 删除一个范围内的元素
nums.erase(nums.begin(), nums.begin() + 2); // 删除前两个元素: [40]
// 清空整个vector
nums.clear(); // []
Vector的大小和容量
理解size和capacity的区别很重要:
- size:当前vector中实际存储的元素数量
- capacity:vector在内存中分配的空间大小(可容纳的元素数量)
相关方法
vector<int> vec;
// 添加一些元素
for (int i = 0; i < 10; i++) {
vec.push_back(i);
}
cout << “大小: “ << vec.size(); // 10
cout << “容量: “ << vec.capacity(); // 通常是16(取决于编译器实现)
cout << “是否为空: “ << vec.empty(); // 0 (false)
// 调整大小
vec.resize(15); // 大小变为15,新增元素初始化为0
vec.resize(5); // 大小变为5,删除多余元素
// 预留空间(避免多次重新分配)
vec.reserve(100); // 容量至少为100,但大小不变
10
20
30
容量:5 | 大小:3
Vector常用方法总结
方法 | 描述 | 时间复杂度 |
---|---|---|
push_back() | 在末尾添加元素 | 平均O(1) |
pop_back() | 删除末尾元素 | O(1) |
insert() | 在指定位置插入元素 | O(n) |
erase() | 删除指定位置元素 | O(n) |
size() | 返回元素数量 | O(1) |
capacity() | 返回当前容量 | O(1) |
empty() | 检查是否为空 | O(1) |
clear() | 清空所有元素 | O(n) |
resize() | 改变大小 | O(n) |
reserve() | 预留空间 | O(n) |
目录导航
- 什么是Vector?
- 基本使用方法
- 访问元素
- 修改和删除元素
- 大小与容量
- 常用方法总结
- Vector的优缺点
- 使用注意事项
- 实际应用示例
什么时候使用Vector?
- 需要频繁在尾部添加/删除元素
- 需要随机访问元素(通过索引)
- 元素数量变化较大
- 不需要在中间频繁插入/删除
Vector的缺点
- 在中间插入/删除效率低
- 预分配内存可能浪费空间
- 扩容时可能需要复制所有元素