二 .deque:在<deque>中定义如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
deque与vector几乎完全相同,但用的较少,因为它适用于要从序列的两端插入或删除,但仍需快速的存取所有元素的情况,通常这样的用法不多。其所提供的方法与vector使用方式基本一致。两者的主要区别在于:
1。实现不必把元素连续地存储在内存中
2。deque提供了push_front和pop_front,这是vector所没有的
3。deque没有通过reserve或capacity提供内存管理机制
4。deque在队头和队尾插入和删除元素时都为常量时间
三。list(列表):是一个标准双向链表。在<list>中定于如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
1。因为同属顺序容器,其方法的使用形式与vector类似。列表不提供[]的随机访问操作,只提供了front和back两种方法。元素增加和删除的方法有:push_back,pop_back,insert,erase和 clear。类似于deque,也提供了push_front和pop_front。类似于deque,不同于vector,列表支持size和empty。但不支持resize和capacity
2。在任意位置插入和删除元素时都为常量时间,不过访问各个元素较慢,为线性时间。如果应用要从数据结构完成多次插入和删除操作,而且不需要快速的基于索引的元素访问,列表就很适合。
四、迭代器
前面所述的容器都有迭代器的访问方式,而且它确实一种通用的访问容器元素的方式。可以把迭代器认为是容器中特定元素的一个指针(安全性也与指针几乎一样,迭代器并不会完成任何合法性的验证)。可以用operator++移至下一个元素,可以用operator*和operator-〉来访问具体的元素或元素的字段。不同的容器提供的迭代器功能有所不同。标准定义了5类迭代器。
迭代器种类 | 支持的操作 | 备注 |
输入 | operator++ operator* operator-> 复制构造函数 operator= operator== operator!= | 提供只读访问,仅为前向(没有operator--来反向移动)。可以用赋值和复制构造函数来赋值和复制迭代器。可以比较迭代器的相等性 |
输出 | operator++ operator* 复制构造函数 | 提供只读访问,仅为前向。不能赋值和复制迭代器。不能比较迭代器的相等性 |
前向 | operator++ operator* operator-> 复制构造函数 默认构造函数 operator= operator== operator!= | 提供读写访问,仅为前向。可以用赋值和复制构造函数来赋值和复制迭代器。可以比较迭代器的相等性 |
双向 | 前向迭代器的功能,再加上: operator-- | 提供了前向迭代器的所有功能。同时还可以反向移动到前面的元素 |
随机访问 | 双向迭代器的功能,再加上: operator+,operator-, operator+=,operator-=, operator<,operator>, operator<=,operator>= operator[] | 等同于哑指针:迭代器支持指针运算、数组索引语法,以及各种形式的比较 |
提供迭代器的标准容器都配备有随机访问或双向访问迭代器。STL中每个支持迭代器的容器类为迭代器类型提供了公共的typedef,名为iterator和const_iterator(对容器的元素提供了只读访问).在使用++运算符时,尽可能使用先自增方式而不是后自增,因为先自增往往更高效。it++(it是定义的迭代器)返回一个新的迭代器对象,++it返回对象的一个引用。
容器提供一个begin()方法,返回指示容器中的第一个元素的迭代器,提供一个end()方法会返回最后元素之后的值的一个引用。他们加在一起提供了一个半开区间,即包括第一个元素,但不包括最后一个元素。