C++/C学习笔记(十)

——存储分配器和适配器

1.存储分配器

STL容器元素的存储空间是动态分配和释放的,不同的硬件平台和操作系统对内存的管理方法和使用方法各不相同,STL为容器类定义了一个专门负责存储管理的类——allocator,但它仅针对内存管理。

Allocator类是一个模版,作为容器类模版的一个policy参数,它不仅与将要为之分配空间的数据对象的类型无关,并且为动态内存的分配和释放提供了面向对象的接口。它是对new运算符的更高层次的抽象,即隐藏了底层的内存模式(段内存、共享内存、分布式内存等),封装了动态内存分配和释放操作,隐藏了指针本身的大小、存储空间重分配模型及内存页大小等细节,提供了更好的可移植性。因此,allocator类为string类、容器类及用户自定义类型、应用程序框架和类库等提供了独立于硬件和操作系统的接口。

2.适配器

(1)容器适配器

基本的容器只有几种,而可用的数学模型却又很多,我们可以在基本容器的基础上通过改变它们的接口来实现特殊的容器,这就是容器适配器(Container Adapter),有时俗称二次封装。

适配器(Adapter)往往是利用一种已有的比较通用的数据结构来实现更加具体的,更加贴近实际应用的数据结构。因此容器适配器窄化了(narrow)或者说强化了基础容器的接口,而基础容器的接口是比较通用的。例如stack就是比较特殊的容器,它可使用deque或list等来实现,但是去掉了那些不符合stack特点的操作,stack的接口受到了比deque和list的接口更强的约束。此外,stack使用deque或list的back()、push_back()、pop_back()操作分别实现其top()、push()、和pop()操作。如下例:

/*****************************************************/

template<typename T,typename S=deque<T>>

class stack{

...

T&top(){return (c.back());}

const T&top() const{return (c.back());}

void push(const value_type&v){c.push_back(v);}

void pop(){c.pop_back();}

...

private:

S c;

};

/*****************************************************/

(2)迭代器适配器(Iterator Adapter)

插入式迭代器(Insert Iterator)以一个容器为操作对象,并向其中插入元素来完成批量输入/输出功能,包括back_insert_iterator、front_insert_iterator和insert_iterator。对于一个back_insert_iterator执行赋值操作就相当于对其绑定的容器执行push_back()操作,对一个front_insert_iterator执行赋值操作就相当于对其绑定的容器执行push_front()操作,而对一个insert_iterator执行赋值操作就相当于对其绑定的容器执行insert()操作。同时对于输出迭代器,反引用(*)、前进(++)、后退(--)、取元素地址(->)等操作都是无意义的,但是为了与普通迭代器具有一致的行为模式,还是保留了反引用和前进的能力,并关闭它们的功能,仅简单地返回自己。

输出流迭代器(ostream_iterator)则通过绑定一个ostream对象来完成批量输出功能,即内部维护一个ostream对象,并将赋值操作(operator=)转换为对该ostream对象的运算符operator<<的调用。同样它关闭了反引用和前进功能,并且禁止后退和取地址操作。无论是把容器的内容全部输出到磁盘文件还是终端,都可以使用该迭代器。如下例:

/*****************************************************/

#include<list>

#include<algorithm>

#include<iterator>

#include<iostream>

using namespace std;

void mian()

{

list<int> li;

for(int k=0;k<10;k++){

li.push_back(k);

}

copy(li.begin,li.end(),ostream_iterator<int>(cout,""));

}

/*****************************************************/

类似地,输入流迭代器(istream_iterator)绑定了一个istream对象来完成批量输入功能,并将前进操作(++)转换为对istream对象的运算符operator<<的调用。该迭代器既可以用于终端输入也可以用于磁盘文件输入。用法如下:

/*****************************************************/

#include<list>

#include<algorithm>

#include<iterator>

#include<iostream>

using namespace std;

void mian()

{

list<int> li;

istream_iterator<int> eos,isiter(cin);

copy(isiter,eos,back_inserter(li));

copy(li.begin,li.end(),ostream_iterator<int>(cout,""));

}

/*****************************************************/

反向迭代器(Reverse Iterator)用于将一个指定的迭代器的迭代行为反转(前进变后退,后退变前进),可用于修饰除前进迭代器外的其他类型迭代器。容器具有的rbegin()和rend()方法返回的就是这种类型的迭代器。

C++/C学习笔记(十一)——存储分配器和适配器相关推荐

  1. Apache Nutch 1.3 学习笔记十一(页面评分机制 LinkRank 介绍)

    下面是Google翻译的http://wiki.apache.org/nutch/NewScoring内容,是关于Nutch 新的链接分数算法的说明,有点类似于Google的PageRank,这里有其 ...

  2. Apache Nutch 1.3 学习笔记十一(页面评分机制 OPIC)

    1. Nutch 1.3 的页面评分机制 Nutch1.3目前默认还是使用OPIC作为其网页分数算法,但其之后,已经引入了PageRank-like算法,以弥补OPIC算法的不足,目前OPIC算法还是 ...

  3. 吴恩达《机器学习》学习笔记十一——应用机器学习的建议

    吴恩达<机器学习>学习笔记十一--应用机器学习的建议 一.训练完模型后下一步要做什么 二.评估算法与模型选择 1.训练集与测试集 2.训练/测试步骤 3.模型选择 4.数据集新的划分--验 ...

  4. 吴恩达《机器学习》学习笔记十一——神经网络代码

    吴恩达<机器学习>学习笔记十一--神经网络代码 数据准备 神经网络结构与代价函数· 初始化设置 反向传播算法 训练网络与验证 课程链接:https://www.bilibili.com/v ...

  5. ROS学习笔记十一:ROS中数据的记录与重放

    ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...

  6. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  7. Vue学习笔记(十一)

    1.Vue学习笔记(十一) 文章目录 1.Vue学习笔记(十一) 1.1Vue_配置代理_方式 1.1.0演示问题 1.1.1运行node server1 1.1.2运行node server2 1. ...

  8. Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)

    Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程) 一.TCP服务器(一请求一线程) 的原理 二.完整代码 三.测试 四.补充 一.TCP服务器(一请求一线 ...

  9. Polyworks脚本开发学习笔记(十一)-玩转获取参数(GET)与设置参数

    Polyworks脚本开发学习笔记(十一)-玩转获取参数(GET)与设置参数 Polyworks采用了脚本语言作为二次开发的工具,因此语言格式上非常规范和统一.其中一个重要的特点就是,几乎所有的对象都 ...

最新文章

  1. 算法笔记-递归算法、递归排序、递归的时间复杂度、master公式(也叫主方法)
  2. 一步一步制作yaffs/yaffs2根文件系统(三)---使用glibc库构造 /lib
  3. Struts2拦截器之FileUploadInterceptor
  4. 程序员吐槽_某程序员吐槽一程序员大佬竟然放弃百度offer,回老家进烟草公司!是不是脑子有坑?网友:你才脑子有坑!...
  5. 学生信息的电子化管理考试题
  6. 牛头刨机械原理matlab代码
  7. 职业人应该“这山望着那山高”
  8. 通向财务自由之路06_适应大环境的交易策略
  9. JS 使用RSA加密解密
  10. Visual Studio 2012安装教程
  11. 刘汝佳第二章习题(前四)
  12. Mac设置鼠标滚轮方向
  13. 次氯酸钠phP,次氯酸钠
  14. 车载网络基础——预备篇
  15. PDF文件不能编辑,有什么办法能够解决?
  16. 【 Rust 基础】控制流 —— Rust 的神级语法03
  17. LM2576 开关电源使用介绍
  18. 【论文阅读】DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation
  19. 【移动通信】 01-移动通信概论
  20. Auto js编写微信小游戏 《一笔画完》 辅助工具--开发篇

热门文章

  1. python打开摄像头cmd_Python调用shell cmd方法代码示例解析
  2. 命令行查看图片_you-get:使用命令行工具下载网络资源,可下载 B 站视频
  3. c语言中嵌套循环的作用,C语言中n层循环嵌套实现
  4. mysql connector api_mysql8 参考手册-Connector/J使用X DevAPI进行连接压缩
  5. 【BZOJ1912】【codevs1613】巡逻
  6. 【BZOJ3191】卡牌游戏,概率DP
  7. 【英语学习】【WOTD】ephemeral 释义/词源/示例
  8. 【英语学习】【WOTD】shard 释义/词源/示例
  9. ubuntu系统DD对拷还原报废笔记本
  10. nginx源码分析之内存池实现原理