vector是一个数组结构,插入、删除、查询、更新 操作和数组相似。
当插入的元素多于现有空间时,会自动new一个2倍现有空间的数组,将旧数据copy过去。
STL list 是一个双向链表,插入、删除、查询、更新 操作和链表相似。
dequeue由一段一段的定量连续空间构成。一旦有必要在dequeue的前端或尾端增加新空间,便配置一段定量连续空间,串接在整个dequeue的头端或尾端。dequeue的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取接口。避开了“重新配置、复制、释放”的轮回,代价是复杂的迭代器架构。
数据结构如下:
块:存放数据的地方
Map:是一个vector,标记dequeue中有哪些块、块的位置
Iterator:dequeue的迭代器比较高级。dequeue结构特殊,但迭代器需要隐藏dequeue的结构。迭代器++、--等操作时,可能跨越块
根据dequeue的数据结构,很容易理解dequeue的操作。
push_back、push_front、pop_back、pop_front操作很快,因为只需对第一个块或者最后一个快操作即可。
insert、erase 类似于vector。insert、erase都需要移动其他元素。不同于vector的是:vector只能向后移动;而dequeue是双向的,可前后移动。
Stack是一种先进后出的数据结构,它有两种实现方式:list、dequue。
很容易理解,将list、dequeue都是双向的,接口略作修改即可。
Queue是一种先进先出的数据结构,它有两种实现方式:list、dequue。
很容易理解,将list、dequeue都是双向的,接口略作修改即可。
Heap的底层用vector实现。具体操作很简单,不详述。
set的底层实现是红黑树(这货我懂一点,就是一个二叉平衡树)。所有元素的键都是自动排序的。Set不允许两个元素键值相同。multiset就另当别论了
map的底层实现也是红黑树,所有元素都是自动排序的。每个元素就是一组key-value。map也不允许相同的key。multiMap就可以。
hashtable是由vector、list 构建一种数据结构。
插入新元素时,根据key的hash值决定了位于哪一个buckets vector中,之后加入bucket对应的list中。
查找和删除元素时,还是根据hash到对应的list中查找或删除元素。