1.Pairs(对组)

(1)class pair可以将两个值视为一个单元。任何函数需返回两个值,也需要pair。

(2)便捷地创建pair对象可以使用make_pair函数

std::make_pair(32,'@')

等价于

std::pair(int,char)(42,'@')

2.Class auto_ptr

(1)auto_ptr是一种指针:它是”它所指向的对象“的拥有者(owner)。所以,当身为对象拥有者的auto_ptr被摧毁时,该对象也将遭到摧毁。auto_ptr要求一个对象只能有一个拥有者,严禁一物二主

(2)auto_ptr不允许你使用一般指针惯用的赋值(assign)初始化方式。你必须直接使用数值来完成初始化。

std::auto_ptr<ClassA> ptr1(new ClassA);	//OK
std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR

(3)auto_ptr拥有权转移

由于一个auto_ptr会删除其所指对象,所以这个对象绝对不能同时被其他对象“拥有”。绝对不应该出现多个auto_ptr同时拥有一个对象的情况。

auto_ptr的copy构造函数和assignment操作符将对象拥有权交出去。

copy构造函数的运用

//initialize an auto_ptr with a new object
std::auto_ptr<Class A> ptr1(new ClassA); //copy the auto_ptr
// - transfers ownership from ptr1 to ptr2
std::auto_ptr<Class A> ptr2(ptr1)

赋值动作

//initialize an auto_ptr with a new object
std::auto_ptr<Class A> ptr1(new ClassA);
std::auto_ptr<Class A> ptr2; //create another auto_ptr
ptr2 = ptr1; //assign the auto_ptr
// - transfers ownership from ptr1 to ptr2

如果ptr2被赋值之前正拥有另一个对象,赋值动作发生时会调用delete,将对象删除

//initialize an auto_ptr with a new object
std::auto_ptr<Class A> ptr1(new ClassA);
//initialize another auto_ptr with a new object
std::auto_ptr<Class A> ptr2(new ClassA);
ptr2 = ptr1; //assign the auto_ptr
// - delete object owned by ptr2
// - transfers ownership from ptr1 to ptr2

(4)起点和终点(source and sink)

拥有权的转移,使得auto_ptr产生一种特殊用法:某个函数可以利用auto_ptr将拥有权交给另一个函数。

    1.某函数是数据的终点

    2.某函数是数据的起点。当一个auto_ptr被返回时,其拥有权便被转交给调用端

std::auto_ptr<ClassA> f()
{
std::auto_ptr<ClassA> ptr(new ClassA);
...
return ptr; //transfer ownership to calling funciton
}
void g()
{
std::auto_ptr<ClassA> p;
p = f(); //p gets ownership of the returned object
//(previously returned object of f() gets deleted)
}

(5)auto_ptr作为成员之一

3.数值极限

(1)C语言所采用的预处理器常数

      整数常数定义于<climits>和<limits.h>,浮点常数定义于<cfloat>和<float.h>

(2)C++通过模板numeric_limits提供极值(定义于<limits>)

4.辅助函数

算法程序库(定义于头文件<algorithm>)内含三个辅助函数,一个用在两值之中挑选较大者,另一个用来在两值之中挑选较小者,第三个用来交换两值。

(1)swap函数

namespace std {
template<class T>
inline void swap(T& a,T& b) {
T tmp(a);
a = b;
b = tmp;
}
};

只有当swap()所依赖的copy构造操作和assignment操作行为存在时,这个调用才有效。

(2)辅助性的“比较操作符”

有四个template functions,分别定义了 !=,>,<=,>=四个比较操作符。它们都是利用操作符==和<完成的

C++标准程序库读书笔记-第四章通用工具的更多相关文章

  1. 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度

    <Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...

  2. 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度

    20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...

  3. 《Linux内核分析》读书笔记(四章)

    <Linux内核分析>读书笔记(四章) 标签(空格分隔): 20135328陈都 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行 ...

  4. 4 Visual Effects 视觉效果 读书笔记 第四章

    4   Visual Effects    视觉效果        读书笔记 第四章 Well, circles and ovals are good, but how about drawing r ...

  5. 《Linux内核设计与实现》读书笔记 第四章 进程调度

    第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的 ...

  6. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  7. Getting Started With Hazelcast 读书笔记(第四章)

    第四章 分而治之 在指导了如何进行基本使用之后,又再次进入理论模块. Hazelcast的基本策略就是切片分区,默认是271个片.内置一个 partition table记录那个节点是那个分区,并在h ...

  8. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  9. 《Linux内核设计与实现》读书笔记——第四章

    标签(空格分隔): 20135321余佳源 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统. ...

随机推荐

  1. 总结前端JQ常用的一些操作手法(慢慢完善)

    1.实例化Js一个object对象,把它当做类来用,事例是操作url的参数 function GetRequestCondition() { var url = window.location.hre ...

  2. 6、Khala的登录生命周期管理

    khala能够对设备进行生命周期管理,并提供了与生命周期相关的接口,用户只需在具体的设备类型实现类中重写这些生命周期接口,即可享受khala对于生命周期管理的同时定制与业务相关的操作.具体接口解释如下 ...

  3. Random获得的随机数怎么样减少重复率

    C#中的Random在获得随机数的时,如果你想要随机循环取得100个随机数则使用如下代码会出现大量的重复数字.代码如下: using System; namespace ConsoleApplicat ...

  4. AngularJs directive 'transclude' option 详解

    transclude好像不是一个英语单词,有道词典里没有,百度翻译的意思是嵌入. transclude在angularjs的自定义的derective中是比较常见的一个东西,所有有必要要了解它. 我们 ...

  5. 基于VMware的eCos环境编译redboot(脚本配置redboot)

    基于VMware的ecos,redboot及hello world(1)安装请参照[[ecos学习2]wmware运行redboot[方法二]--图形实现配置 ] (2)修改内存布局文件:~/i386 ...

  6. linux io优化

    场景:xml文件解析入库:并备份 问题:磁盘io异常,经常100%busy: linux io优化方法: 1.修改磁盘挂着参数,修改为writeback模式:对于文件读取频繁的可以设置noatime: ...

  7. ES6新特性-------数组、Math和扩展操作符(续)

    三.Array Array对象增加了一些新的静态方法,Array原型上也增加了一些新方法. 1.Array.from 从类数组和可遍历对象中创建Array的实例 类数组对象包括:函数中的argumen ...

  8. html中的特殊符号表示法

    html中的特殊符号 符号 说明 编码   符号 说明 编码   符号 说明 编码 " 双引号 " × 乘号 × ← 向左箭头 ← & AND符号 & ÷ 除号 ÷ ...

  9. C# 动态Linq(结合反射)

      这篇文章决定对最近一个单机版Web程序用到的东西总结一下. 一.反射Linq之OrderBy 动态Linq结合反射对某字段排序: namespace 动态Linq { class Program ...

  10. SVN客户端--TortoiseSVN使用说明(转)

    TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. TortoiseS ...