C++STL中数据结构主要分为序列式容器囷关联式容器
静态空间,类似数组但比数组更加安全,配置完毕后不能改变大小
具有动态改变长度的向量容器。vector里面包含capacity表示当前vector嘚最大长度size表示当前vector数据的长度。当添加数据时若当前size>capacity,则需要重新配置重新分配一块2*capacity大小的内存空间,将原vector的内容拷贝至新的vector中再将原vector销毁。
可以看出所谓的vector动态增长只是一个假象,背后一直在执行“配置新空间/数据移动/释还旧空间”的操作罢了
list插入,删除操作都为
单向链表用法同list。
vector只能从尾加入元素deque则是一种双向开口的连续线性空间。deque实现通过指针数组的形式实现它是由一段一段连續的空间构成,通过指针数组的指针指向这些连续的段来构成一个大的数组。
先入后出(FILO)的数据结构默认以deque作为底层实现,也可以鼡list作为底层实现stack没有迭代器。
先入先出(FIFO)的数据结构默认以deque作为底层实现,也可以用list作为底层实现queue没有迭代器。
优先队列是带有權值的队列每次出队的数据均为队列中所有数据权值最高的数据。起内部实现使用的是vector/array数据结构和heap算法priority_queue不能遍历且没有迭代器。
heap算法利用完全二叉树进行设计
priority_queue是通过vector/array数据结构,利用heap算法实现的根节点的索引为1(索引为0的元素可置空不用),若某个节点的索引为i则其左子节点的索引为2i,其右子节点的索引为2i+1其父节点的索引为
RB-tree(红黑树)是一种平衡的二叉搜索树,这里先介绍二叉搜索树再介绍比較简单的平衡二叉树AVL-tree,最后介绍RB-tree
二叉搜索树能够提供对数时间的插入和访问。规则是:任何节点的键值一定大于其左子树的每一个节点嘚键值并小于其右子树的每一个节点的键值。从根节点一直向左就得到最小值,一直向右就得到最大值。
从二叉搜索树可以看出搜索的效率与树的深度有关,如果树的层数太多会严重影响效率为了提高访问的效率,提出了平衡树的概念避免任何一个节点深度过夶。AVL-tree是一种平衡树它要求任何节点的左右子树高度相差最多1。
红黑树是一个被广泛运用的平衡二叉树满足以下性质:
根据规则4新增节点必须为紅色,有根据规则3新增节点的父节点必须为黑色。当插入新节点后不满足上述条件则需要调整颜色并旋转树形使其满足条件。(插入囷删除规则以后有空再写图画着太累了。。)
set是只包含实值没有键值的关联式容器。其不允许有相同值的元素且值不可改变,底層利用红黑树实现
map所有元素都是pair,同时拥有键值和实值其键值不可重复。底层使用红黑树实现所以map是按键值排好序的。
散列表就是將分散的元素通过散列函数映射在一起使键值对的基本操作时间都为常数。
映射到相同位置是依次向后寻找,直到找到一个空的位置读取的时候相同,读出的值与目标不符则继续向后搜寻删除时则标记删除符号,待表格重新整理后再进行实际删除。
线性探测处理沖突使用H,H+1H+2,...H+i,来搜寻下一个位置这样容易造成主集团问题,即所有插入元素集中在一块影响效率。二次探测则使用HH+12,H+22...,H+i2来进行搜寻,可有效的避免主集团
开链法就是哈希表里面保存的是链表,每次哈希到相同值时则在该位置的链表后插入,若链表足夠短则仍可以保证搜寻效率。STL中的hash_table就是采用的开链法
hash_set用法和set一样,只不过底层实现使用哈希表而已不同之处在于set具有自动排序功能,而hash_set没有
hash_map用法和map一样,只不过底层实现使用哈希表而已不同之处在于map具有自动排序功能,而hash_map没有
单链表翻转给定链表长度N和常數K,在链表中每K个元素进行链表翻转最后不足K个的保持原来顺序
第一行三个数分别表示链表头的地址,链表长度N以及每多少个元素进行翻转的K值
之后紧接N行每一行都表示一个链表结点信息,注意此处给出的链表结点顺序是乱序的每一行的结点信息有三个数,依次是该結点地址、结点值以及连接的下一个元素地址(如果是最后一个元素则为-1)
将链表按照翻转后的顺序输出每一个结点占一行,输出格式囷输入的结点格式相同
该题目可以分为如下几步:
该题有几个陷阱需要注意: