数据结构之STL

以下自己整理的东东很多参考[如下链接],如果雷同,纯属抄袭…

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();      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值