「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 中添加或删除元素时,特别是通过 inserterase 方法时,可能会使指向被修改区域的迭代器失效。因此,在迭代过程中修改 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++系列」数据结构



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。