STL概览-通用工具pair,auto_ptr,std::rel_ops(二)

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

 

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

对组

|

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

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

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

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

|

|->Type----->struct

|->Include--->

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

|

|->member

|      |------>first

|      |------>second

|

|->Sub

|      |------>constructordefault,assignment,copy)

|

|->Fun

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

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

 

 

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

智能指针

|

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

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

|->思想----->用以个类(auto_ptr)来包含newdelete

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

|->个性

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

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

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

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

|

|->陷阱

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

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

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

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

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

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

|

|->Type-----> class

|->Include--->

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

|

|->Sub

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

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

|

|->Fun

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

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

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

 

 

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

三个辅助函数

|

|->名称

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

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

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

|

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

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

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

|

|->说明

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

|      |------> swap能够被正确执行的前提是你的必须有copy costructorassignment

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

|

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

|->Include--->

 

 

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

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

|

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

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

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

|

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

|

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

|

|->type---->namespace

 

 

以上的这些东西只是C++标准委员会这样定义的,并不代表所有的编译器都遵从了这个准则,(比如,我这现在用的编译器就没有std::tel_ops这一项),学习的是其中的思想。如果你愿意,完全可以在这种思想的指导下自己付诸实现。这才是乐趣之所在。

 

你可能感兴趣的:(C++)