简介
STL (C++容器)是一些常用数据结构(如链表、可变长数组、排序二叉树)和算法(如排序、查找)的模板的集合。STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。
容器其实是类模板。它们实例化后就成为容器类(实例化时要指定容器元素的类型),用容器类定义的对象称为容器对象。
当插入元素时,是把元素复制了一份再插入
被放入容器的对象所属的类最好重载 < 和 == 比较运算符
容器的分类
- 顺序容器:元素在容器中不是排序的,元素的位置与元素的值无关。比如:动态数组 vector、双端队列 deque、双向链表 list
- 关联容器:元素在容器中时排好序的(默认是从小到大),插入时不能指定位置。比如:set、multiset、map、multimap
- 将容器一部分功能屏蔽,并增加另一部分功能即构成容器适配器 stack,queue,priority_queue。
容器的类型一样就可以进行 < <= > >= != == 比较运算符的比较
例如:
a<b:规则类似于词典中两个单词比较大小,从头到尾依次比较每个元素,如果发生 a 中的元素小于 b 中的元素的情况,则a<b的值为 true;如果没有发生 b 中的元素小于 a 中的元素的情况,且 a 中的元素个数比 b 少,a<b的值也为 true;其他情况下值为 false。元素比较大小是通过<运算符进行的。
成员函数
容器的成员函数一般有
int size():返回容器对象中元素的个数。
bool empty():判断容器对象是否为空。
顺序容器和关联容器还有以下成员函数:
begin():返回指向容器中第一个元素的迭代器。
end():返回指向容器中最后一个元素后面的位置的迭代器。
rbegin():返回指向容器中最后一个元素的反向迭代器。
rend():返回指向容器中第一个元素前面的位置的反向迭代器。
erase(...):从容器中删除一个或几个元素。
clear():从容器中删除所有元素。
如果一个容器是空的,则 begin() 和 end() 的返回值相等,rbegin() 和 rend() 的返回值也相等。
顺序容器
front():返回容器中第一个元素的引用。
back():返回容器中最后一个元素的引用。
push_back():在容器末尾增加新元素。
pop_back():删除容器末尾的元素。
insert(...):插入一个或多个元素。
关联容器
因为关联容器在内部是排好序的,所以在插入时不能指定插入位置。并且不能修改set的元素的值,不能修改map元素键的值,修改之后容器不会自动调整顺序,有序性会被破坏,这时再查找就会得到错误的结果。
关联容器内部比较大小是用 <
运算符。
特有的成员函数如下
find:查找某个值。
lower_bound:查找某个下界。
upper_bound:查找某个上界。
equal_range:同时查找上界和下界。
count:计算等于某个值的元素个数。
insert:插人一个元素或一个区间。
容器适配器
容器适配器有 stack
queue
priority_queue
三种,都是在顺序容器的基础上屏蔽了一些功能,突出或增加了另外一些功能。
特有的成员函数:
push:添加一个元素。
top:返回顶部(对 stack 而言)或队头(对 queue、priority_queue 而言)的元素的引用。
pop:删除顶部(对 stack 而言)或队尾(对 queue、priority_queue 而言)的元素
另外容器适配器是没有迭代器的,STL中的很多排序、查找、变序算法都不能用
其实stl算法也是函数模板,大多数都在 algorithm
这个头文件中。