vector原理:
[
动态数组,连续内存,用3个指针控制,一个指向开始,一个指向结束,一个指向已用的结尾
首先分配固定内存,用于存放数据;当新加入数据超过内存大小时,vector会重新分配一块更大的内存,然后把
之前的内容拷贝到新的vector种,然后把旧的删除,所以有时会出现迭代器失效,就是因为旧的删除了,解决办法
是给迭代器重新赋值,即指向新的vector
说明:vector扩容大小与编译器有关,不同编译器不一样,但肯定是变大的
]
list原理:
[
链表,而且是双向链表,内存是不连续的
链表,包含[头+各个node]
]
map原理:
[
红黑树,源码上继承的就是红黑树
树:父节点,左子树,右子树
红黑树特点:
红黑树是一种含有红黑结点并能自平衡的二叉查找树
最上面的根节点是黑色,黑节点下面是任意的,红节点下面一定是2个黑色
任意一结点到每个叶子结点的路径都包含数量相同的黑结点,所以我们叫红黑树这种平衡为黑色完美平衡
说明:
map删除会导致迭代器失效,怎么办?
给迭代器重新赋值,用erase返回值赋值
]
------------------
从内存看,
vector内存是连续的,list和map内存不是连续的
轮询方法:
vector,正常轮询,简单
list,链表的轮询
map,红黑树的轮询,
3种内存结构:
连续内存
链表类型 --增删改查 --提示:[头+各个node]
树类型 --增删改查 --提示:父节点,左子树,右子树
树的轮询:
从根节点开始
↓
->------------------- 设置当前节 -----------------------------------<-
| ↓ |
向左子树查找 判断当前节点是否为空?->是->返回null 向右子树查找
↑ ↓否 ↑
| key相等 ->是->返回当前节点 |
| ↓否 |
---------------------------当前Key较大?-----------------------------------