信奥竞赛

系列

剑指信奥 | C++ 之 STL - vector

剑指信奥 | C++ 之 STL - vector

问题的产生

今天,我们继续学习 STL 标准模版库的内容。

首先,我们回忆一下 C++ 数组的内容,看示例代码:

#include <iostream>

using namespace std;

int main() {

int array[] = {1, 2, 3};

cout << array[0] << endl;
cout << array[1] << endl;
cout << array[2] << endl;

return 0;
}
/*
output:
0
1
2
*/

这是一份简单的数组代码示例,我们定义了一个含有 3 个整型元素的数组,依次输出了这个数组的 3 个元素。

如果一组数据确定的只有 3 个,用这个数组就可以完成存储的任务。

但是,在现实情况中,往往很多时候我们并不能在一开始就知道数据的数目,即便开始的数目是已知的,后期也会变化,或增加,或减少。

而在 C++ 中,一般而言,数组是 静态 static 的,含义是,一点数组声明完成,元素的数量就不能再更改了。

这就仿佛是一艘轮船,一旦建好,装载的货物量就是一定的了,无法变得更多。

那么,面对实际需求中的动态变化的数据,我们是要制造的是一辆货运列车,装多少货物都可以根据实际的需要,通过动态的添加或减少车厢的数量来做到。

具体到在 C++ 语言中,我们用什么来完成这个功能呢?

是时候让 向量 vector 出场了。

什么是 vector

vector 是 STL 容器类中十分常用的一个类库,它的出现就是为了解决上述问题,即实现一个 动态 dynamic 的数组。

有了 vector,我们不必再关注数据到底有多少个,因为 vector 可以随时随意的改变大小,增减数据数量,非常的方便。

同时,STL 的泛型编程特性,也在 vector 里开始有了具体的体现。

那么,我们就开始学习 vector 的使用吧。

vector 的声明

使用 vector 要引入 vector 模版库,我们先看一份代码示例:

#include <iostream>
#include <vector>

using namespace std;

int main() {

// vector 的声明
vector<int> vi;

// vector 的 size
cout << vi.size() << endl;

return 0;
}
/*
output:
0
*/

这段代码就是 vector 的声明,注意声明时的 <int> 表明这个向量存储的元素都是整型的数字,体现了泛型编程的特点。

在这个声明里,我们看不到指示元素数量的标识,因为数量在 vector 中是不重要的,这正是它动态性的体现。

通过 size() 函数可以查看当前容器中数据的实际数目。

这样,一个向量的声明就完成了。

vector 的操作

对于所有的容器类而言,我们的主要操作无非是这样几件事:

  1. 增加数据 Create
  2. 查询数据 Retrieve
  3. 修改数据 Update
  4. 删除数据 Delete

这四类操作一般简称为 CRUD,它们以及其他一些相关操作,是我们学习各种容器类的主要内容。

我们来看关于 vector 的基本操作:

#include <iostream>
#include <vector>

using namespace std;

int main() {

vector<int> vi;

// 初始 size
cout << vi.size() << endl;

// 数据数量
int n;

cin >> n;

// 把 n 个数据存入 vector
for (int i = 0; i < n; i++) {
vi.push_back(i);
}

// 实际数据 size
cout << vi.size() << endl;

return 0;
}
/*
output:
0
100
100
*/

在这份代码中,我们首先接收了来自用户的输入 n,代表我们要向 vector 中存放数据的数目,然后使用循环向容器添加了 n 个数据,再次调用 size() 输出数据量是 n。

注意向 vector 添加数据的函数是 push_back()

在有了数据之后,怎么从容器中取数据呢?

这一点,vector 与数组类似,是使用 [] 下标的方式返回某一个元素的引用:

#include <iostream>
#include <vector>

using namespace std;

int main() {

vector<int> vi = {1, 2, 3};

cout << vi[0] << endl;

return 0;
}
/*
output:
1
*/

最后,我们来看 vector 中,如何修改数据和删除数据:

#include <iostream>
#include <vector>

using namespace std;

int main() {

vector<int> vi = {1, 2, 3};

// 在位置 0 处插入元素 0
vi.insert(vi.begin(), 0);
for (int i : vi) {
cout << i << '\t';
}

// 删除最后一个元素
vi.pop_back();
cout << endl << vi.size() << endl;

// 清空所有元素
vi.clear();
cout << vi.size() << endl;

return 0;
}
/*
output:
0 1 2 3
3
0
*/

以上,就是 vector 容器类的主要操作方法。

当然,实际的操作还有更多,这些内容都是我们将来学习算法的必要基础,一定要熟练掌握。