转】STL摘要一:通用工具(pair,auto_ptr,std::rel_ops)

本文介绍了C++标准库中的几个核心组件,包括pair用于便捷的数据组合;auto_ptr用于智能内存管理,有效避免资源泄露;max、min和swap等辅助函数简化编程流程;以及std::rel_ops提供的比较运算符封装。
摘要由CSDN通过智能技术生成
2008-11-10 13:31

C++标准库中的通用工具,他们多是短小精悍的函数或者类,完成那些最一般的工作,大致如下:

 

============================================================

对组

|

|->名称----->pair

|->动机----->方便

|->思想----->结构

|->应用----->如果某个函数要求传回两个值,可能比较有用

|

|->Type----->struct

|->Include---> <utility>

|->Define----> pair<calss first,calss second>(first,second)

|

|->member

|      |------>first

|      |------>second

|

|->Sub

|      |------>constructor(default,assignment,copy)

|

|->Fun

       |------>operator(==,<,<=,>,>=,!=,=)

       |------>make_pair(first,second) 返回一个新的pair

 

 

============================================================

智能指针

|

|->名称----->auto_ptr

|->动机----->防止“被异常抛出时发生资源泄露”

|->思想----->用以个类(auto_ptr)来包含new和delete

|->应用----->如果你要用new,那么尽量想起它

|->个性

|      |------> ①与所指的对象同生共死 ——核心

|      |------> ②由于①则:严禁一物(对象)两主(auto_ptr)

|      |------> ③由于②则:拥有权(ownership)转移——这个最有意思,但也最危险。

|      |------> ④跟一般的指针具有不对等的地位

|

|->陷阱

|      |------> ①用同一对象对两个auto_ptr初始化

|      |           |---->违背了个性②

|      |------> ②在类中没有重载赋值运算符

|      |           |---->由于个性③而可能出现问题,同样于copy constructor

|      |------> ③定义auto_ptr数组

|                   |---->与①所表述的核心不相关

|

|->Type-----> class

|->Include---> <memory>

|->Define----> auto_ptr<class>(new class)

|

|->Sub

|      |------> constructor (default , assignment , copy)

|      |------> reset(ptr) 用ptr重新初始化auto_ptr

|

|->Fun

       |------> operator (* ,-> ,=)

       |------> get() 返回auto_ptr所指对象的地址,并不释放自身的拥有权

       |------> release() 返回auto_ptr所指对象的地址,但释放自身的拥有权

 

 

============================================================

三个辅助函数

|

|->名称

|      |----->max<class>(x,y) ,max<class>(x,y,compare)

|      |----->min<class>(x,y) ,min<class>(x,y,compare)

|      |----->swap<class>(x,y)

|

|->动机----->方便

|->思想----->函数

|->应用----->太多了

|

|->说明

|      |------> ①max和min都有两种参数形式,第一种好说,第二种的conpare表示比较函数

|      |------> ②swap能够被正确执行的前提是你的<class>必须有copy costructor和assignment

|                     这是swap的内部机制决定的——他先调用copy产生一个中间对象,然后调用        |                   assignment轮换对象

|

|->Type----->函数

|->Include---> <algorithm>

 

 

==============================================================

比较运算符的一个简洁形式

|

|->名称----->std::rel_ops

|->动机----->尽最大可能代码重用

|->思想----->由于比较运算最基本的只有两个:<和==(当然也可以是>和==,只不过STL选择了前)。|             其他的各种运算都可根据这两个剧本运算很快的得出结果。那么,当然可以用某种形式把 |            其他的比较运算封装起来,直接利用了。STL采用的是命名空间的做法——std::rel_ops |             包含了>,!=,<=,>=这四个比较运算。

|

|->应用----->如果你写的类需要重载比较运算符,那么简单的一句using namespace std::rel_ops是|            在简单不过的事了。相信每一个跟我一样懒惰的人都会喜欢:)

|

|->陷阱----->std::rel_ops只是帮你把>,!=,<=,>=这四个比较运算封装了起来,而且它的实现是建立 |            在你自己正确的重载了<和==的基础之上的。不要指望什么事都不干,一个           |               std::rel_ops就能万事大吉,打下哪有这么美的事?!

|

|->type---->namespace

 

===================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值