STL-容器

容器

1.容器种类、容器的内存管理和分配策略

随机访问迭代器,支持[n]+n等跳跃式访问

双向访问迭代器,只支持自增++、自减--的访问操作

a. 【序列式容器】vector(动态数组)

a) 迭代器:随机访问迭代器+迭代器失效问题见上

b) 内存分配与管理策略:整块连续内存+容器满时插入元素,申请两倍于现在大小的内存,然后元素全部拷贝过去

c) 其他问题

i. Clearclear并不释放vector所占的空间,虽然size变成了0

ii. 快速释放vector所占内存:vector(v).swap(v),创建一个临时变量和原有容器交换,临时变量会马上超出它的scope,死掉,释放所占内存。

b. 【序列式容器】list(双向循环链表)

a) 迭代器:双向访问迭代器+迭代器失效问题见上

b) 内存分配与管理策略:节点存储在不连续的内存空间+链表的内存管理那一套

c. 【序列式容器】deque(双端双向队列)

a) 迭代器:随机访问迭代器+迭代器失效问题见上

b) 内存分配与管理策略:分段连续的线性空间+一块主控map(缓冲区索引表)

d. 【序列式容器的适配器】stack(栈)

a) 迭代器:无迭代器,栈的先进后出特性不允许它拥有迭代器

b) 内存分配与管理策略:由双端双向队列deque封闭一口改造而成,内存分配与管理同deque

e. 【序列式容器的适配器】queue(队列)

a) 迭代器:无迭代器,队列的先进先出特性不允许它拥有迭代器

b) 内存分配与管理策略:由双端双向队列deque封闭一口改造而成,内存分配与管理同deque

f. 【序列式容器的适配器】heap(大顶堆)

a) 迭代器:无迭代器,大顶堆取最大元素的特性不允许它拥有迭代器

b) 内存分配与管理策略:由vector+heap算法改造而成,内存分配与管理同vector

g. 【序列式容器的适配器】priority_queue(优先级队列)

a) 迭代器:无迭代器,优先级队列取最大值的特性不允许它拥有迭代器

b) 内存分配与管理策略:由heap改造而成,内存分配与管理同vector

h. 【关联式容器】RB-Tree(红黑树)(平衡树)

a) 红黑树定义

i. 根节点为黑;叶节点(NULL节点)为黑

ii. 节点不是红色就是黑色

iii. 红节点的子节点一定是黑节点

iv. 任意节点到其叶节点的黑节点个数是决定的

b) 红黑树是一棵平衡树

i. 上述性质决定最短分支全黑,最长全红,最长为最短2倍,所以平衡

c) 插入删除

i. 本质都是为了保证黑节点个数到分支相同这一特性。删的时候都是黑转红,插得时候会有红转黑

ii. 根据只有一个分支的二叉查找树的时间复杂度为O(n)、满二叉树的二叉查找树时间复杂度为O(log2N),及夹逼准则可得红黑树的增删查改时间复杂度为Ologn

i. 【关联式容器】set(集合)/mutilset

a) 由红黑树实现

b) Set的元素即其键值

c) 非随机访问迭代器,所以插入不会使迭代器失效(双层架构迭代器)

d) Mutilset:允许键值重复

j. 【关联式容器】map(映射)/multimap

a) 由红黑树实现

b) map的元素为pair,一对键-

c) 非随机访问迭代器,所以插入不会使迭代器失效(双层架构迭代器)

d) Mutlimap:允许键值重复

k. 【关联式容器】hash_sethash_map

a) hash表实现

b) Hash表冲突解决方案

i. 线性探测:+1+2+3···容易导致堆积问题

ii. 二次探测:+1^2-1^2+2^2-2^2+3^2-3^2···次堆积问题

iii. 开链法(类似桶排的东西):相同的值存在一个链表里

2.容器的选择

a) hash_mapmap的选择【漂亮代码的理解:使用尽量小的代价,出效果】

i. hash_map的查找时间是常数级的,但是为了消灭次堆积问题,使装填度尽量小,它所占的内存是远大于它实际使用的。map由红黑树实现,所以它的增删查改的时间复杂度为O(logn),慢于hash_map,但是它不会像hash_map一样占有很大的内存。

ii. 不在意内存,在意速度的话使用hash_map;在意内存,不在意速度使用map

b) Vectorlistdeque

i. 注重查改能力用vector;注重增删能力用list;前后增删+好的查改用deque

c) Stackqueuepriority_queue

i. 特殊能力使用


你可能感兴趣的:(c++)