文章目录
- 一、vector 容器
- 1. 基本特性
- 2. 基本操作
- 3. 注意事项
- 二、应用场景
- 1. 应用场景
- 2. 案例
- 案例一:存储动态大小的数据集合
- 案例二:实现栈
- 三、相关链接
一、vector 容器
C++ 中的 vector
是一个非常常用的容器(container),它属于 STL(Standard Template Library,标准模板库)的一部分。vector
是一个能够存储具有相同类型元素的动态数组,这意味着它可以在运行时动态地增加或减少大小。与普通的数组不同,vector
会自动管理其存储空间,并在需要时重新分配内存以容纳更多的元素。
1. 基本特性
- 动态数组:
vector
的大小可以在运行时改变,即可以动态地添加或删除元素。 - 连续内存:
vector
中的元素存储在连续的内存位置中,这意味着可以像普通数组一样通过索引快速访问任何元素(即使用operator[]
)。 - 自动内存管理:
vector
自动管理其存储空间的分配和释放,无需用户手动处理。 - 随机访问迭代器:由于
vector
的元素存储在连续的内存中,它支持随机访问迭代器,这意味着可以直接通过索引访问任何元素。
2. 基本操作
- 包含头文件:使用
vector
之前需要包含头文件<vector>
。
#include <vector>
- 创建
vector
:
std::vector<int> vec; // 创建一个空的 int 类型的 vector
std::vector<int> vecWithValues = {1, 2, 3, 4, 5}; // 创建一个包含 5 个整数的 vector
- 添加元素:
vec.push_back(6); // 在 vec 的末尾添加一个元素 6
vec.insert(vec.begin(), 0); // 在 vec 的开始位置插入一个元素 0
- 访问元素:
int firstElement = vec[0]; // 访问第一个元素
int lastElement = vec.back(); // 访问最后一个元素
int secondElement = *(vec.begin() + 1); // 使用迭代器访问第二个元素
- 删除元素:
vec.pop_back(); // 删除 vec 的最后一个元素
vec.erase(vec.begin()); // 删除 vec 的第一个元素
// 删除特定位置的元素
vec.erase(vec.begin() + 2); // 删除索引为 2 的元素(注意,索引是从 0 开始的)
- 遍历
vector
:
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
// 使用迭代器
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用 C++11 的范围 for 循环
for (int value : vec) {
std::cout << value << " ";
}
std::cout << std::endl;
3. 注意事项
- 内存分配:当
vector
的大小增加时,它可能需要重新分配内存以存储更多的元素。这通常涉及复制或移动所有现有元素到新分配的内存中,这可能会是一个耗时的操作。 - 迭代器失效:在
vector
中添加或删除元素时,特别是通过insert
或erase
方法时,可能会使指向被修改区域的迭代器失效。因此,在迭代过程中修改vector
时需要特别小心。
vector
是 C++ 中一个非常强大且灵活的容器,几乎可以替代所有需要动态数组的场景。
二、应用场景
vector
容器在 C++ 中有着广泛的应用场景,主要得益于其动态数组的特性,能够方便地存储和操作任意数量的同类型元素。以下是一些 vector
容器的应用场景及详细案例:
1. 应用场景
- 存储动态大小的数据集合:
- 当需要存储的数据量在程序运行时可能发生变化时,
vector
是一个很好的选择。它可以动态地增加或减少大小,以适应不同的数据需求。
- 代替数组:
- 在许多情况下,
vector
可以作为数组的替代品,提供更多的功能和便利的操作。例如,vector
支持动态扩容,而数组的大小在定义后就不能改变。
- 实现栈和队列:
- 可以使用
vector
来实现栈和队列等数据结构。通过push_back()
方法可以在vector
的末尾添加元素,模拟栈的压栈操作;通过pop_back()
方法可以删除vector
的最后一个元素,模拟栈的弹栈操作。对于队列,可以使用insert()
和erase()
方法在vector
的前端进行插入和删除操作,但通常使用deque
(双端队列)更为合适,因为它在两端都支持快速插入和删除。
- 实现动态数组:
- 由于
vector
的大小可以动态调整,因此它非常适合用来实现动态数组。这在需要频繁增减元素的情况下尤为有用。
- 存储容器元素:
vector
可以作为其他容器的元素,实现复杂的数据结构。例如,可以创建一个vector<vector<int>>
来表示二维数组或矩阵。
- 作为函数参数:
- 可以将
vector
作为函数的参数传递,方便进行数据的传递和处理。由于vector
支持复制构造函数和赋值操作,因此可以很容易地在函数之间传递vector
对象。
2. 案例
案例一:存储动态大小的数据集合
假设我们需要存储一个班级中所有学生的分数,但事先不知道学生的具体数量。这时,可以使用 vector
来存储这些分数。
#include <iostream>
#include <vector>
int main() {
std::vector<int> scores;
// 假设我们不知道学生的具体数量,但可以动态地添加分数
scores.push_back(90);
scores.push_back(85);
scores.push_back(95);
// 遍历并打印分数
for (int score : scores) {
std::cout << score << " ";
}
std::cout << std::endl;
return 0;
}
案例二:实现栈
使用 vector
实现一个简单的栈结构,支持压栈和弹栈操作。
#include <iostream>
#include <vector>
class Stack {
private:
std::vector<int> data;
public:
void push(int value) {
data.push_back(value);
}
int pop() {
if (!data.empty()) {
int top = data.back();
data.pop_back();
return top;
}
throw std::out_of_range("Stack is empty!");
}
bool isEmpty() const {
return data.empty();
}
};
int main() {
Stack s;
s.push(1);
s.push(2);
s.push(3);
while (!s.isEmpty()) {
std::cout << s.pop() << " ";
}
std::cout << std::endl;
return 0;
}
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C++系列」C++简介、应用领域
- 「C++系列」C++ 基本语法
- 「C++系列」C++ 数据类型
- 「C++系列」C++ 变量类型
- 「C++系列」C++ 变量作用域
- 「C++系列」C++ 常量知识点-细致讲解
- 「C++系列」C++ 修饰符类型
- 「C++系列」一篇文章说透【存储类】
- 「C++系列」一篇文章讲透【运算符】
- 「C++系列」循环
- 「C++系列」判断
- 「C++系列」函数/内置函数
- 「C++系列」数字/随机数
- 「C++系列」数组
- 「C++系列」字符串
- 「C++系列」指针
- 「C++系列」引用
- 「C++系列」日期/时间
- 「C++系列」输入/输出
- 「C++系列」数据结构