这一类的比较以前写过一篇,但是找不到了。这次再总结一下。
STL基本容器分为:顺序容器和关联容器
顺序容器
1.Vector其内部是由动态数组(dynamic array)实现,其他操作都是以这个实现为基础的。
Vector支持随机存取,只要知道位置就可以在常数时间内存取任何一个元素。在末端附加或者删除元素性能很好
在中部删除或者添加元素性能不理想,因为要移动后面的其他元素。
Vector容量很重要,因为一旦元素数量大于容量,内存会重新分配,导致references,pointers和iterators都失效
内存配置很耗时间。
在概念上Vector和String类似,但是Vector不能用reserve()来缩减容量。
安插元素和移除元素都会使“作用点”之后的各元素的references,pointers和iterators失效。
Vector有特化版本vector<bool>,其耗用空间远远小于一般vector。
2.deque同样由动态数组来实现,但是数组头尾都开放,通常实现为一组独立的区块。deque和vector有着几乎一摸一
样的接口,但是在功能上也有不同之处:
(1)可以在两端安插或者删除元素。
(2)存取元素时,deque内部有一个间接过程,所以元素存取和迭代器动作会稍慢。
(3)迭代器要在不同的区块跳转,所以必须是智能指针,非一般指针
(4)不支持对内存的重分配机制。除了头尾,在任何作用点安插或删除元素都会使所有pointers,references,iterator失效。
(5)会释放不再被使用的区块。
(6)不提供容量capacity, reserve()操作。
3.Lists由双向链表实现。
list和vector,deque的主要区别为:
(1)list 不支持随即存取
(2)在任何位置安插或者删除都是常数时间完成。
(3)安插或删除不会造成迭代器失效
4.stack系由deque实现的后进先出的堆栈。
stack核心接口为三个成员函数push(), top(),pop(),底层会调用deque的,push_back(),back().
注意:pop()是移除下一个元素但是并不将它返回,top()返回下一个元素但是并不将它移除。
5.queue同样由deque实现,是一个先进先出的队列。
实际上queue单纯的把各项操作转化为内部容器的对应调用。
注意:pop()虽然移除下一个元素,但是并不返回它,front()和 back()返回下一个元素,但是并不
移除它。
6.priority queue 默认由vector实现
实际上priority queue单纯的把各项操作转化为内部容器的对应调用。
注意优先队列中,“下一个元素”是指优先级最高的元素
核心接口为三个成员函数push(), top(),pop()
7.String
关联容器:
Set和Multisets
Set和Multisets都是以平衡二叉树实现。Multiset允许元素重复,而Set不允许。