C++标准库中的通用工具,他们多是短小精悍的函数或者类,完成那些最一般的工作,大致如下:
============================================================
对组
|
|->名称----->pair
|->动机----->方便
|->思想----->结构
|->应用----->如果某个函数要求传回两个值,可能比较有用
|
|->Type----->struct
|->Include--->
|->Define----> pair
|
|->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--->
|->Define----> auto_ptr
|
|->Sub
| |------> constructor (default , assignment , copy)
| |------> reset(ptr) 用ptr重新初始化auto_ptr
|
|->Fun
|------> operator (* ,-> ,=)
|------> get() 返回auto_ptr所指对象的地址,并不释放自身的拥有权
|------> release() 返回auto_ptr所指对象的地址,但释放自身的拥有权
============================================================
三个辅助函数
|
|->名称
| |----->max
| |----->min
| |----->swap
|
|->动机----->方便
|->思想----->函数
|->应用----->太多了
|
|->说明
| |------> ①max和min都有两种参数形式,第一种好说,第二种的conpare表示比较函数
| |------> ②swap能够被正确执行的前提是你的
| 这是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这一项),学习的是其中的思想。如果你愿意,完全可以在这种思想的指导下自己付诸实现。这才是乐趣之所在。