目录

C++ STL基础

第七章 STL

六大部件

stl_items.png

分配器:为容器分配内存

迭代器:算法只能通过迭代器访问容器

容器

stl.png

Array

定长数组

_M_instance:指向数组首元素的指针(int a[10]的a)

array_overview.png

iterator为指针,traits通过指针特化处理

array.png

Vector

变长数组

start(4B):指向第一个元素的指针

finish(4B):指向最后一个元素的下一个指针

end_of_storage(4B):容器申请的内存空间的最后一个元素的下一个地址

若内存空间不够则申请当前空间两倍的空间

vector_overview.png

iterator为指针,traits通过指针特化处理

vector_iterator.png

List

双向链表

node(4B):指向头节点的指针

list_overview.png

iterator里的node为指向当前节点的指针

list_iterator.png

Forward List

单向链表

forward_list.png

Deque

双端队列

queue在内存中每个buffer块离散存储,通过map表记录各buffer块的地址

start(16B):指向首元素的iterator

finish(16B):指向尾巴元素下一个块的iterator

map(4B):指向map首元素的指针

map_size:map占用内存的大小

deque_overview.png

cur:指向当前元素的指针

first:指向当前buffer块首元素的指针

last:指向当前buffer块尾元素下一个块的指针

node:指向map对应元素的指针

deque_iterator.png

Queue

队列

不允许遍历也不提供iterator

可选择list或deque作为底层存储

不可选择vector作为底层存储

queue.png

Stack

不允许遍历也不提供iterator

可选择list或deque或vector作为底层存储

stack.png

Set

集合

t:红黑树

set.png
集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::set红黑树有序O(log n)O(log n)
std::multiset红黑树有序O(logn)O(logn)
std::unordered_set哈希表无序O(1)O(1)

std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加

Map

键值对集合

t:红黑树

map.png
映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::map红黑树key有序key不可重复key不可修改O(logn)O(logn)
std::multimap红黑树key有序key可重复key不可修改O(log n)O(log n)
std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1)

std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的

Functors

Iterator Traits

由于算法需要得到iterator的某些属性,对于非指针iterator的结构包含属性,但对于指针类型无法获取。通过iterator traits对于iterator处理