看了《STL源码剖析》,对于里面的容器,下面进行了简单的总结。
1. vector:
底层使用数组保存。push_back时若已经满了,则会2*n扩展空间,若实际元素数量低于分配空间的1/4,则会将空间回收为原来的一半。《STL源码剖析》里面没有讲到空间的回收,是之前查找资料时看到。调整空间时,是先申请新的空间,然后将旧空间的内容拷贝过去,然后再释放旧的空间。
只适用于快速查找及只在末尾增删,而不适用于动态增删(可能涉及到元素的移动)。对元素进行增删时,可能导致旧的迭代器失效。
2. list:
底层是双向链表,支持头尾增删,并且是一个环。
不适用于查找频繁的情况,但适用于动态增删。
3. deque:
底层是一个分段的线性表。笼统的说就是使用了一个二维指针,第一维是每段的信息,而第二维就是一个数组了,实际保存的元素就是在这里。
头尾都支持插入,但是维护麻烦很多。
4. stack
是一个容器适配器,默认底层使用deque,适配之后只能从头插入和删除。
5. queue
是一个容器适配器,默认底层使用deque,适配之后只能从尾插入,从头删除。
6. slist
使用单向链表实现的列表。
6. map、multimap、set
底层使用红黑树实现,multimap是key值可重复的map。
7. hash_map、hash_set
底层使用hashtable实现,其中hashtable是采用开链法来防止哈希冲突的。