c++标准程序库之通用工具

        4.1 struct pair

      pair将两个值视为一个单元,该结构体有两个成员,first和second,在map和multimap中用它管理键值对。函数返回两个值,也可使用pair。

      pair除了提供了构造函数族(默认,拷贝,普通),还提供了静态的构造函数make_pair(cosnt T1&, cosnt T2&)。当然,pair提供了比较操作符,first和second对应相等时两个pair才相等,比较时先比较first再比较second。

      4.2 class auto_ptr

      auto_ptr(自动指针)是为防止“抛出异常时发生资源泄漏”而设计的智能指针,他也是标准库中唯一的一个智能指针。auto_ptr由一个new出来对象的指针构造而成,且他的构造函数为explicit的。auto_ptr销毁对象使用delete操作符,因此不能用数组地址构造他。auto_ptr是他所指对象的拥有者owner,且一个对象只能有一个owner。auto_ptr被销毁时,所指对象由auto_ptr的析构函数delete掉,因此无需也不要显式delete他的对象,这也是设计auto_ptr想要的效果。

      4.2.1 所有权的传递

      auto_ptr在赋值和传参时会发生所有权ownership的转移。转以后源自动指针丧失了所有权,目的自动指针得到了源的所有权;若目的自动指针已拥有对象,则该对象被delete掉。返回一个自动指针(或使用自动指针做参数)的函数会交出(或获得)一个对象的所有权,对该对象来说函数是他创建的起点(或销毁的终点)。也许你会问,返回或传参一个自动指针的引用会如何,个人认为这样会改变自动指针的所有权(除非你在函数中不使用这个参数)。改变的结果是这个自动指针失去了原有对象,获得或未获得新的对象。传递一个const引用逻辑上是错误的,库函数禁用了这个操作(这样做会语法错误,通不过编译。原因是auto_ptr的拷贝构造函数的参数是auto_ptr&而不是const auto_ptr& !)。因此,作者建议避免传递(const or non-const) auto_ptr& 的设计。

      4.2.2 cosnt auto_ptr

      const auto_ptr指的是auto_ptr的所有权时const的,任何改变const auto_ptr所有权的操作都是语法错误的。所以不能拷贝和赋值一个const auto_ptr。这里我看到了使用语法规则规范用户操作的方法。我们把构造函数声明为private而使得一个类不能被继承,正是用了这个思想。

      4.2.3 使用与误用

      auto_ptr是为发生异常时释放资源而设计的,应用场合最后是符合这一设计。也许我们会需要智能指针的其他特性,但不建议使用auto_ptr完成这些工作,我会另发博文介绍boost库提供的智能指针。

      I. 函数释放某对象前可能会发生异常,这是需要一个自动指针拥有这个对象,完成自动释放。

      II. 使用自动指针作为类成员。主要是为了防止构造对象时发生异常而造成的资源泄漏,因此这些auto_ptr成员常出现在构造函数的成员初始化列表中。但是类的拷贝构造函数和赋值操作符需要自己重写,因为默认的情况会使得auto_ptr交出所有权。如果auto_ptr在其生命周期中不存在所有权的转移,最好将其声明为const的。这样可以防止“不经意的悲剧”。

      误用了auto_ptr无疑是一场悲剧。下面是auto_ptr使用的几个禁忌,一定要记清楚了。

      I. auto_ptr之间不能共享所有权,使用两个auto_ptr对一个对象操作是不可能的。

      II. auto_ptr只能指向对象,不能指向数组。

      III. auto_ptr不满足STL容器对元素的要求。所以不要创建auto_ptr的容器。

      VI. 不要使用auto_ptr的引用作为函数的参数。传递const auto_ptr&会产生语法错误。传递non-const auto_ptr&则无法预知改变后的auto_ptr是否拥有了新对象。这是一种糟糕的设计,应该用其他途径完成我们想要的工作。

      4.2.4 auto_ptr的成员函数

      查看msdn的文档吧,不在这里列出了,这里给出一个auto_ptr的实现,作为解决疑惑的第一手资料:http://www.josuttis.com/libbook/util/autoptr.hpp.html。关于auot_ptr与左右值概念以及与auto_ptr_ref转换的部分等学习了template再做讨论。

      4.3 max(),min(),swap()和辅助比较操作符

      这部分的内容比较轻松。max(),min(),swap()包含于algorithm头文件,max()和min()可以给定比较函数对象。这三个函数的参数要求为同一类型。

      辅助操比较作符,即用户提供<和==操作符后,utility头文件可生成对应的其他比较运算符。这也很简单,其他的比较都可以有它们两个组合完成嘛。

     5. 文中谈及了数值极值和cstddef,cstdlib头文件,暂时用不到,不做讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值