以下自己整理的东东很多参考[如下链接],如果雷同,纯属抄袭…
1,STL介绍(空间配置器详解)
标准模板库,C++的标准库之一。
STL包含6大部件:容器、迭代器、算法、仿函数、适配器和空间配置器。
容器:容纳一组元素的对象。
迭代器:提供一种访问容器中每个元素的方法。
函数对象:一个行为类似函数的对象,调用它就像调用函数一样。
算法:包括查找算法、排序算法等等。
适配器:用来修饰容器等,比如queue和stack,底层借助了deque。
空间配置器:负责空间配置和管理。对象构造钱的空间配置和对象析构后的空间释放。
要考虑如下问题:
- 向system heap要空间
- 考虑多线程状态
- 考虑内存不足
- 考虑小型区块可能造成的内存碎片问题
对于内存破碎问题,SGI使用了双层级配置器 - 第一级直接使用allocate()调用malloc()、deallocate()调用free(),使用类似new_handler机制解决内存不足(抛出异常),配置无法满足的问题(如果在申请动态内存时找不到足够大的内存块,malloc 和new 将返回NULL 指针,宣告内存申请失败)。
- 第二级视情况使用不同的策略,当配置区块大于128bytes时,调用第一级配置器,当配置区块小于128bytes时,采用内存池的整理方式:配置器维护16个(128/8)自由链表,负责16种小型区块的此配置能力。内存池以malloc配置而得,如果内存不足转第一级配置器处理。
但SGI也存在一些问题
- 自由链表所挂区块都是8的整数倍,因此当我们需要非8倍数的区块,往往会导致浪费。
- 由于配置器的所有方法,成员都是静态的,那么他们就是存放在静态区。释放时机就是程序结束,这样子会导致自由链表一直占用内存,自己进程可以用,其他进程却用不了。
2,各种容器的特点和适应情况
3,vector二三事
- vector底层实现原理
动态数组,三个迭代器。[start, finish]是已经被使用的范围,[start, end_of_storage]整块连续存储空间。
当内存不足时,自动申请1.5倍或2倍更大的空间,然后将原来的拷贝到新的空间中,接着释放原来空间。【vector内存增长机制】
vec.clear时,存储空间不释放,仅仅是清空数据而已。因此一旦空间配置,所有的迭代器都会失效。
- vector中reserve和resize的区别
resize:改变当前容器内含有元素的数量。
reserve:改变的是capacity的量。
- size和capacity的区别
- 元素类型可以是引用吗
- 引用并不分配实际地址,元素不可是引用
- 正确释放内存
vec.clear():清空内容,但是不释放内存。
vector().swap(vec):清空内容,且释放内存,想得到一个全新的vector。
vec.shrink_to_fit():请求容器降低其capacity和size匹配。
vec.clear();vec.shrink_to_fit();:清空内容,且释放内存。
- 为什么要以1.5或2倍扩容
算法啊。。。 - 常用函数
vector<int> vec(10,100); 创建10个元素,每个元素值为100
vec.resize(r,vector<int>(c,0)); 二维数组初始化
reverse(vec.begin(),vec.end()) 将元素翻转
sort(vec.begin(),vec.end()); 排序,默认升序排列
vec.push_back(val); 尾部插入数字
vec.size();