C++:vector

目录

一、关于vector

二、vector的相关函数

三、相关函数的使用

①构造函数

②size

③[]

​编辑

④push_back

⑤迭代器iterator

⑥reserve

⑦resize

⑧find

⑨insert

⑩erase

⑪sort


一、关于vector

vector比较像数组

C++:vector_第1张图片

观察可知,vector有两个模板参数

第一个模板参数是一个数据类型

这里的数据类型可以是int,可以是double,甚至可以是string

第二个模板参数是空间配置器,给了缺省参数,默认用库里的空间配置器,如果有特殊场景需要自己实现,也可以用自己编写的空间配置器

另外,前面学习了string,只要string能够掌握,那么vector也就基本会用了,因为这些容器内部提供的接口都是非常类似的


二、vector的相关函数

vector里是没有find的,之所以没有是因为把find放到一个头文件里的,需要包头文件,即:

#include

C++:vector_第2张图片

C++:vector_第3张图片

三、相关函数的使用

①构造函数

有四种构造函数

C++:vector_第4张图片

第一个是可以用自己的空间配置器进行构造函数初始化

第二个是用n个val初始化,其中size_type也就是size_t,即无符号整型

而value_type是:

C++:vector_第5张图片

看图可知value_type是第一个模板参数typedef的,allocator_type是第二个模板参数typedef的

第三个是迭代器区间构造

第四个是拷贝构造

C++:vector_第6张图片

这是列举的三种构造函数的方式


②size

size就是vector中存储数据的数量

C++:vector_第7张图片vector的size也和string的size一样,可以用于遍历vector


③[]

[]可以让vector像数组一样去访问

上面的size所举例也用到了[]

C++:vector_第8张图片

[]的返回值的第n个位置的引用

所以返回值可以修改,即:

C++:vector_第9张图片

[]的作用和at几乎一致,但是[]是assert判断是否越界,越界直接终止程序,而at越界则是抛异常进行处理


④push_back

push_back是用于尾插数据

C++:vector_第10张图片


⑤迭代器iterator

迭代器是一个像指针一样的东西

C++:vector_第11张图片

it是自己取的名字,叫什么都行

迭代器都是在内部定义的,所以属于这个类域,因此是vector::iterator调用

当然迭代器也可以修改:

C++:vector_第12张图片

这里的begin和end和string里的一样,就不演示了

C++:vector_第13张图片

C++:vector_第14张图片

当然iterator是正向迭代器,reverse_iterator就是反向迭代器了,如果打印也就是反向

C++:vector_第15张图片

rbegin和rend也就不多说了

当然,范围for也可以用,因为范围for底层就是迭代器实现的

C++:vector_第16张图片


⑥reserve

reserve是用于提前开空间,避免扩容造成的损耗

C++:vector_第17张图片

提前开20个空间,减少扩容损耗


⑦resize

resize是用于提前开空间加初始化

C++:vector_第18张图片


⑧find

这里的find是在头文件algorithm里的,vector并没有提供,是一个函数模板

传一个迭代器区间给它,返回值是迭代器

C++:vector_第19张图片

是左闭右开的区间 

如果没有找到返回的是last,即end()的返回值

所以需要用if语句进行判断,find一般与insert结合起来用,如下图:

C++:vector_第20张图片


⑨insert

insert是用于插入元素

C++:vector_第21张图片

第一种用法就是pos位置插入val,即上面find用法中的举例

第二种是pos位置插入n个val

第三种是pos位置插入迭代器区间,不常见,了解即可


⑩erase

erase是删除数据

C++:vector_第22张图片

erase给出了两种用法,一种是删除pos位置的数据,一种是删除一个迭代器区间的数据

C++:vector_第23张图片

erase也是需要if语句判断返回值是否找到了,如果不判断直接删除,若没有找到,直接删除会报错


⑪sort

sort是排序算法

sort同样不是vector中的,也是包在头文件algorithm中,可以针对各个类型的容器排序

C++:vector_第24张图片

可以传迭代器区间给它即可排序,默认升序,如果想排降序或是自己写一个仿函数作为第三个参数也支持

C++:vector_第25张图片

库里是有两个写好的仿函数,一个less一个greater,less是升序,greater是降序,都是类模板

但是需要注意的是greater是在functional的头文件中 

不写默认是less,即升序,如果想改为降序,在sort的第三个参数传一个greater的匿名对象即可:

C++:vector_第26张图片

当然能排序vector,string也是可以排序的,也是传入string的迭代器区间即可,不同的是如果想排降序,匿名对象中的类型要传char,即sort(s.begin(), s.end(), greater())

这里也可以体验到什么叫泛型编程,我们使用的这个sort,它不管你是什么数据类型,不管升序还是降序,只需要用传入的迭代器去访问,模版的一个体现

你可能感兴趣的:(C++,c++,算法,开发语言)