今天,我们继续学习 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
是 STL 容器类中十分常用的一个类库,它的出现就是为了解决上述问题,即实现一个 动态 dynamic 的数组。
有了 vector
,我们不必再关注数据到底有多少个,因为 vector
可以随时随意的改变大小,增减数据数量,非常的方便。
同时,STL 的泛型编程特性,也在 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()
函数可以查看当前容器中数据的实际数目。
这样,一个向量的声明就完成了。
对于所有的容器类而言,我们的主要操作无非是这样几件事:
Create
Retrieve
Update
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
容器类的主要操作方法。
当然,实际的操作还有更多,这些内容都是我们将来学习算法的必要基础,一定要熟练掌握。