STL容器选择

个人笔记

1、缺省状态下应该选择vector,因为vector内部结构最简单,并允许随机存取,所以数据的存取十分方便,数据的处理也快。
2、如果经常要在头部和尾部安插和移动元素,应该采用deque,如果希望元素被移除时,容器能够自动缩减内存,也应该使用deque。
3、如果经常在容器的中段执行元素的安插、移除和移动,可以使用list,list提供特殊的成员函数,可以在常数时间内从A容器将元素转移到B容器,但是list不支持随机存取,所以如果只知道list的头部元素,需要访问list的中部元素,性能会大打折扣。
4、如果经常需要根据某个准则来搜寻某个元素,那么应该使用“以该排序准则对元素进行排序的”set或者multiset。
5、如果需要key/value pair,应当使用map或者multimap。如果需要关联数组,也可以使用map或者multimap。

序列式容器
所谓序列式容器,其中的元素都可序,但未必有序。
vector
vector与标准库的array数组相似,空间由自己动态分配,采用线性的连续空间
优点:由于vector是连续性的所有读取效率高。
缺点:在插入数据方面效率不高,需要频繁插入数据方面不建议使用

list
list一个循环双向链表,所以只需要一个指针,可以遍历整个链表。
优点:在插入元素时 效率高,特别是在需要对元素做一系列增删改查操作时,内部提供了许多对元素操作的接口。
缺点:

deque
deque 顾名思义是双端队列,存储一系列的指针,指针指向的存储区(缓冲区)才是deque的主体。
优点:可以在头尾两端做元素插入和删除
缺点:插入的时候需要检索插入点前的元素个数和插入点后的元素在元素少的地方插入,插入效率不高

关联式容器
set
set所有元素都会根据元素的键值进行自动排序,元素的键值就是实值,底层机制采用红黑树 --RB-tree
优点:用于自动排序好
缺点:不允许有相同的键值,不能根据set的迭代器改变set的元素值
multiset的特性以及用法 和set完全一样,唯一区别是multiset允许键值重复。因为它的插入操作采用的是RB-tree的insert_equal,而不是insert_unique。

map
map的特性是,所有的元素会根据元素的键值自动排序,所有元素以pail形式呈现,pail第一元素为键值,第二元素为实值。底层也采用红黑数RB-tree实现
优点:适用特定环境下需关联键值与实值得情况。
缺点:map不允许元素拥有相同的键值,不可改变map的键值,但可以修正元素的实值
multimap的特性以及用法 和map完全一样,唯一区别是multimap允许键值重复。因为它的插入操作采用的是RB-tree的insert_equal,而不是insert_unique。

priority_queue

hashtable
hash table实现是通过hash function实现的。为了避免hash function带来的“碰撞”问题,常用的是二次线性探测和开链法
优点:适用特定环境下需关联键值与实值得情况。
缺点:hash function 会带来“碰撞”问题。

hash_set
hash_set是以hashtable为底层机制,RB-tree有自动排序功能而hash table没有,因此set的元素有自动排序功能,而hash_set没有。这是它俩的唯一区别,其他操作是一样的。

hash_multiset与multiset的操作基本一样,唯一区别也是无自动排序功能。

hash_map
hash_map底层机制也是hash table,与map的区别也是五排序功能。hash_multimap,亦如此。
配接器
*
stack*
stack是一种先进后出的数据结构,只允许在一端插入元素和移出或取得最顶端元素。
以底层容器作为元素,list和deque ,以deque为默认容器,没有迭代器

queue
queue是一种“先进先出”的数据结构。只允许底端加入元素,顶端取出元素,不允许遍历。
以list,deque容器为底层结构。也是没有迭代器

仅作为个人学习记录。
如有侵权请联系WX:Qk1490819692.

你可能感兴趣的:(STL容器)