c++STL库
*************************容器的底层:
*******容器
*vector向量容器
(数组)底层是一个固定大小数组,2倍的大小增加空间,当我们数组大小超过了再去做push_back,则会先开辟2
倍空间在把原来的东西移过来再析构原来对象释放原来空间。
operator[] vec1.swap(vec2)
*list双向链表容器
(双向链表)
*deque双端队列
(动态开辟的二维数组)deque首先开辟以为两个数组,二维长度是4096/sizeof(存储类型)假设为整形开辟了1024个数组。
然后把头尾指针指向[1][512],当头尾插入时候头插满了,往[0][1024]插如果一维[0]号1024都满了,就在一维上扩大为
原来的两倍及增加了一维23号位,然后把原先的很多个一维数组移动到以 一维个数/2-1的地方开始依次排列。尾部如果插
满了也类似。源码是这样子的管理内存空间的。
operator[]
*set map集合 map表
(红黑树) 增删查都是log n
insert(val) set.find(20) count(val)统计方法
map.insert(make_pair("name",vec3)); 课件STL3
*unorderedset unorderedmap(Boost库中的) stl中是hashmap
(链地址法实现的hash表)增删查都是趋近o(1)
hash可以看成vector中套了一个list,一维数组的下标可以看成散列码。根据规定的hash函数带入key可以在指定的桶后面插入val。
当桶的使用率超过一个比率例如0.75,那么就扩容到原来两倍再把原来的数据按新桶后面。
*******容器适配器
*stack
底层是deque
*queue
底层是deque
*priority_queue
底层是vector做成的大根堆
***********************allocator空间配置器
*一级空间配置器:allocator
4种new
*二级空间配置器Nginx memory pool:
结构体ngx_pool_cleanup_s用于描述一个从内存池中分配出去的、需要特殊回收的内存块,成员data
指向这个需要特殊回收的内存块,Handler在回收data所指向内存块时使用,next指向下一个需特殊回
收内存块的管理结构体,这样所有需要特殊回收内存块的管理结构体都被组织成一个链表结构。(具体同目录nginx原理)
**********************迭代器
#include<iterator>
容器里面有数据改动的时候,迭代器有可能失效。
正向迭代器
iterator()
插入型迭代器
front_inserter()
back_inserter()......copy(vec1.begin(),vec1.end(),front_inserter(vec2));
流迭代器
ostream_iterator copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "))
istream_iterator
*********************函数对象function&泛型算法algorithm
泛型算法都是包含起始元素不包含末尾元素
sort(begin,end) 小到大
sort(begin,end,greater<int>())大到小
find(begin,end,val)
findif(begin,end,)
ostream_iteator<int>(cout," ");