C++STL——vector

C++教学总目录

1、vector简介

vector是表示大小可以改变的数组的序列容器,vector是一个模板类,可以存储int、double、string等类型。包含于头文件<vector>
vector实际上跟顺序表很相似,我们可以把它当作顺序表来使用。
在这里插入图片描述
T代表数据类型,后面的Alloc实际上是空间配置器,也就是内存池,平时使用的时候不需要管Alloc,只需要指明数据类型即可。例如:vector<int>、vector<string>

那么使用如何使用vector来充当二维数组存储int类型数据呢?
vector<vector<int>>,如图:

在这里插入图片描述

2、构造函数

在这里插入图片描述
第一个相当于是无参的构造函数,这里这个参数是调用了空间配置器来获取空间的——这里不管。第二个构造函数相当于给n个val进行初始化。第三个构造函数使用的是迭代器区间初始化(记得左闭右开)。第四个就是拷贝构造函数了。使用如下:

vector<int> v1; // 无参构造函数
vector<int> v2(10, 1); // 初始化10个1
string s = "hello world";
vector<char> v3(s.begin(), s.end());    // 使用s的迭代器初始化v3
vector<int> v4(v2.begin(), v2.end());   // 使用v2的迭代器初始化v4
vector<int> v5(v4); // 拷贝构造函数

v1-v5容器中数据如下:
在这里插入图片描述

赋值运算符重载类似string,这里不在赘述。


3、迭代器

在这里插入图片描述
begin、end为正向迭代器,支持普通对象和const对象。
rbegin、rend为反向迭代器,支持普通对象和const对象。
在string介绍我们说过,cbegin、cend实际上对应的是const对象的正向迭代器,但begin、end已经有重载了,所以都可以使用。crbegin、crend同理。

下面代码遍历vector:

vector<int> v(10, 1);
// 重载operator[],像数组一样使用
for (int i = 0; i < v.size(); i++)
{
    
    
	cout << v[i] << " ";
}
cout << endl;

// 范围for——底层是迭代器
for (auto e : v)
{
    
    
	cout << e << " ";
}
cout << endl;

// 使用正向迭代器遍历
vector<int>::iterator it = v.begin();
while (it != v.end())
{
    
    
	cout << *it << " ";
	++it;
}
cout << endl;

// 使用反向迭代器遍历
vector<int>::const_reverse_iterator crit = v.rbegin();
while (crit != v.rend())
{
    
    
	cout << *crit << " ";
	++crit;
}
cout << endl;

4、容量相关函数

在这里插入图片描述
1、size返回当前容器数据个数。
2、返回容器可以存储的最大数据个数——没有什么意义
3、修改数据个数——类似前面string,可以扩容和减少数据个数。
4、返回当前容器的容量。
5、判断当前容器是否为空——即是否有数据
6、扩容
7、这个目前没什么用——有兴趣自行了解。

主要来看resize和reserve:
在这里插入图片描述
在这里插入图片描述

这里的resize有点像前面构造函数给n个val初始化。当所给的n小于size()时,将缩小size到n,当n>size()时,将开空间+初始化。而reserve就是单纯的开空间。这里的几个函数都类似string,不在赘述。


5、访问元素

在这里插入图片描述
1、重载了operator[],所以可以像数组一样使用。
2、at函数传参也是数组下表,但是at函数越界是抛异常,而operator[]越界直接断言程序就崩了。所以operator[]的检查更加严格
3、front获取数组头部元素,back获取数组尾部元素。


6、修改容器

在这里插入图片描述
1、push_back和pop_back尾插和尾删。但是并没有头插和头删,因为vector是顺序表,头插和头删时间复杂度为O(N),效率非常低下。但是可以使用insert和erase实现头插头删。

vector<int> v;
v.push_back(1); // 尾插数据1
v.pop_back();   // 尾删一个数据

2、insert:支持在任意位置插入数据
在这里插入图片描述
这里位置给的是迭代器,使用如下:
在这里插入图片描述
这里使用的是第一个函数,返回值是迭代器——也就是插入位置的迭代器。


在这里插入图片描述
这里演示的是第二个insert函数


在这里插入图片描述
这里是第三个函数,可以支持插入一段迭代器区间,演示插入的是字符,字符转换成对应的ASCII码值头插到v中。


3、erase函数
在这里插入图片描述
支持删除某个位置的值、支持删除一段迭代器区间。使用如下:

vector<int> v;
for (int i = 1; i <= 10; i++)
	v.push_back(i);
v.erase(v.end()-1); // 删除最后一个元素10
v.erase(v.begin() + 5, v.end()); // 删除6-9

4、assign函数
在这里插入图片描述
这个函数是将所有内容清空,然后再进行初始化的。使用如下:

string s = "hello world";
vector<char> vc(10, 'a');
vector<int> v1(10, 1);
vc.assign(s.begin(), s.end()); // 将vc所有内容清空,并用字符串的值初始化
v1.assign(10, 2);  // 将v1所有内容清空,并用10个2初始化

5、其他函数
swap函数类似string,交换两个vector的值。clear就是清除容器中的所有元素。
另外有两个C++11新增的函数,这里涉及到了C++11的右值引用移动语义和可变参数包,这个到C++11再说。


7、algorithm算法库

头文件<algorithm>包含了许多算法,例如排序、查找等。这里我们就介绍这两个函数。

在这里插入图片描述
sort函数是用来排序的,前两个参数为迭代器区间,如果不给第三个参数,默认是升序。如果要排降序,需要通过第三个参数来实现。第三个参数就是仿函数——后面会介绍

1、使用sort函数实现升序:

在这里插入图片描述

2、使用sort函数实现降序:
在这里插入图片描述


在这里插入图片描述

find函数给出一段迭代器区间和要查找的val。

3、使用find函数查找容器v中的20,并删除。
在这里插入图片描述
algorithm库中还有很多其他的函数,大家自行学习。常用的有:swap、max、min等等

猜你喜欢

转载自blog.csdn.net/Talon7/article/details/143332619