1.容器
顺序容器有以下三种:可变长动态数组 vector、双端队列 deque、双向链表 list
vector 是可变长的动态数组,支持随机访问迭代器,在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。
list(双向链表)在已经定位到要增删元素的位置的情况下,增删元素能在常数时间内完成,不支持根据下标随机存取元素
deque 也是顺序容器的一种,同时也是一个可变长数组,在 deque 中,随机存取任何元素都能在常数时间内完成(但慢于vector)。它相比于 vector 的优点是,vector 在头部删除或添加元素的速度很慢,在尾部添加元素的性能较好,而 deque 在头尾增删元素都具有较好的性能(大多数情况下都能在常数时间内完成)。它有两种 vector 没有的成员函数:
void push_front (const T & val); //将 val 插入容器的头部
void pop_front(); //删除容器头部的元素
它们之所以被称为顺序容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置(尾部、头部或中间某处)插入,元素就会位于什么位置。
关联容器有以下四种:set、multiset、map、multimap。关联容器内的元素是排序的。插入元素时,容器会按一定的排序规则将元素放到适当的位置上,因此插入元素时不能指定位置。
- set:排好序的集合,不允许有相同元素。
- multiset:排好序的集合,允许有相同元素。
- map:每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的。不允许有多个元素的关键字相同。
- multimap:和 map 类似,差别在于元素的关键字可以相同。
默认情况下,关联容器中的元素是从小到大排序(或按关键字从小到大排序)的,而且用<
运算符比较元素或关键字大小。因为是排好序的,所以关联容器在查找时具有非常好的性能。
容器适配器:除了以上两类容器外,STL 还在两类容器的基础上屏蔽一部分功能,突出或增加另一部分功能,实现了三种容器适配器:栈 stack、队列 queue、优先级队列 priority_queue。
容器适配器都有以下三个成员函数:
- push:添加一个元素。
- top:返回顶部(对 stack 而言)或队头(对 queue、priority_queue 而言)的元素的引用。
- pop:删除一个元素。
容器适配器是没有迭代器的,因此 STL 中的各种排序、查找、变序等算法都不适用于容器适配器。
所有容器都有以下两个成员函数:
- int size():返回容器对象中元素的个数。
- bool empty():判断容器对象是否为空。
顺序容器和关联容器还有以下成员函数:
- begin():返回指向容器中第一个元素的迭代器。
- end():返回指向容器中最后一个元素后面的位置的迭代器。
- rbegin():返回指向容器中最后一个元素的反向迭代器。
- rend():返回指向容器中第一个元素前面的位置的反向迭代器。
- erase(...):从容器中删除一个或几个元素。该函数参数较复杂,此处省略。
- clear():从容器中删除所有元素。
如果一个容器是空的,则 begin() 和 end() 的返回值相等,rbegin() 和 rend() 的返回值也相等。
顺序容器还有以下常用成员函数:
- front():返回容器中第一个元素的引用。
- back():返回容器中最后一个元素的引用。
- push_back():在容器末尾增加新元素。
- pop_back():删除容器末尾的元素。
- insert(...):插入一个或多个元素。该函数参数较复杂,此处省略。
2. 迭代器
1) 正向迭代器,定义方法如下:
容器类名::iterator 迭代器名;
2) 常量正向迭代器,定义方法如下:
容器类名::const_iterator 迭代器名;
3) 反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名;
4) 常量反向迭代器,定义方法如下:
容器类名::const_reverse_iterator 迭代器名;