「C++系列」vector 容器
·零落· 2024-08-28 10:35:02 阅读 75
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程
文章目录
一、vector 容器1. 基本特性2. 基本操作3. 注意事项
二、应用场景1. 应用场景2. 案例案例一:存储动态大小的数据集合案例二:实现栈
三、相关链接
一、vector 容器
C++ 中的 <code>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++系列」数据结构
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。