Chapt.4 Utilities——辅助函数

2015年05月19日
算法程序库中有三个辅助函数,一个用来在二值中判断最大的,一个用来判断最小的,一个用来交换

Min & Max

min 和 max 通常可以用三元操作符?:来判断大小,但是,algorithm算法库中还提供另外一个版本,接受一个额外的template参数作为比较准则:

  1. template <class T, class Compare>
  2. inline const T& min(const T& a, const T& b, Compare comp)
  3. {
  4. return comp(b, a) ? b : a;
  5. }
  6. template <class T, class Compare>
  7. {
  8. inline const T& max(const T& a, const T& b, Compare comp)
  9. {
  10. return comp(a, b) ? b : a;
  11. }
  12. }

上述代码中的comp就是所谓的“template参数”,通过上述代码我们看到,其实comp是一个函数或者仿函数(理解为函数的一种),用来返回一个bool值,在min和max中根据这个布尔值来确定大小准则。

有一点需要注意:min()和max()需要他们所接受的两个参数的类型一致,如果不一致,将会报错。

不过到时可以显式的声明参数类型,如:

  1. int i; long l;
  2. l = max<long>(i , l);//将max声明为long类型,那么会有将i转换为long的隐式转换

swap

在《C++标准程序库》中,关于swap的部分比较晦涩,主要是通过一段代码来讲解swap的好处的。文字部分如下:

swap()的最大的优势在于,通过template specialization(模板特化)或function overloading(函数重载),我们可以为更复杂的类型提供特殊的实作版本(应该理解为实际使用的版本);我们可以交换对象内部称愿,不必劳师动众的反复赋值,这无疑大大节约时间。标准程序库中的所有容器以及strings都运用了这项技术。

我们先看一下与这段文字匹配的代码是怎么样的:

  1. class MyContainer
  2. {
  3. private:
  4. int* elems;
  5. int numElems;
  6. public:
  7. void swap(MyContainer& x)
  8. {
  9. std::swap(elems, x.elems);
  10. std::swap(numElems, x.numElems);
  11. }
  12. };
  13. //全局swap函数
  14. inline void swap(MyContainer& c1, MyContainer& c2)
  15. {
  16. c1.swap(c2);
  17. }

单看这段代码也觉得莫名其妙,似乎根本没有必要如此定义一个简单的swap函数。但是结合上面的文字,那么我们应该这样理解这段代码:

  1. MyContainer类中的swap成员函数只能绑定一个具体的对象,换句话说,只能出现诸如c1.swap(c2)这样的调用。在swap成员函数中使用了两次原始的swap用来交换数据成员。
  2. 全局的swap函数的目的是能够直接使用类似于swap(c1, c2)这样的调用,于是直接在全局swap钟调用了其中的一个参数的swap成员函数。

我个人觉得这样并不比直接使用c1.swap(c2)这样的形式更为简练或有别的好处。但是使用书上的方法书写swap函数的话,是对swap的重载,能减少接口参数的差异(就是我在不知道swap函数是怎么定义的时候也能猜出来大致应该怎么写swap啦)。


头文件cstdlib中exit和abort的区别

在头文件cstdlib中,exit()和abort()都是用来在任意地点终止程序运行的函数,它们不会返回main函数。
区别:

  • exit()会销毁所有的static对象,将所有的缓冲区(buffer)清空,关闭所有的I/O通道,然后终止程序(之前会调用经由atexit()登录的函数)。如果atexit()登录的函数抛出异常,会调用terminate()。
  • abort()会立即终止函数,不做任何清理工作。

这两个函数都不会销毁局部对象,为确保所有的局部对象的析构函数获得调用,应该用异常或正常返回机制由main函数离开。

来自为知笔记(Wiz)

时间: 2024-08-05 09:07:03

Chapt.4 Utilities——辅助函数的相关文章

Chapt.4 Utilities——auto_ptr & pair

Pair对 class Pair 可以将两个值视为一个单元,c++标准库中任何两个需要返回两个值的地方都要pair. pair中的make_pair函数可以不显式指定类型的构造一个pair对象,如: void f(std::pair<int, const char*>); void g(std::pair<const int, std:: string>); -- void foo() { f(std::make_pair(42, "hello")); g(st

CodeIgniter辅助函数

辅助函数是帮助我们完成特定任务的函数.每个辅助函数文件仅仅是一些函数的集合.例如,URL Helpers 可以帮助我们创建链接,Form Helpers 可以帮助我们创建表单,Text Helpers 提供一系列的格式化输出方式,Cookie Helpers 能帮助我们设置和读取COOKIE, File Helpers 能帮助我们处理文件,等等.跟其他部分不同的是,辅助函数不是用类的方式来实现的.它们仅仅是一些简单的过程处理函数. 每个辅助函数处理一个特定的任务,并且不必依靠其他函数. Code

MySQL管理工具MySQL Utilities — 介绍与安装(1)

MySQL Utilities介绍 MySQL Utilities 提供一组命令行工具用于维护和管理 MySQL 服务器,包括: 管理工具 (克隆.复制.比较.差异.导出.导入) 复制工具 (安装.配置) 一般工具 (磁盘使用情况.冗余索引.搜索元数据) MySQL Utilities是一系列的命令行工具以及Python库更容易完成管理的任务.库是用Python语言写的,这就意味着不需要安装其他任何工具和库.当前是基于Python2.6版本设计的,不支持Python3.1版本. MySQL Ut

CodeIgniter框架——表单辅助函数总结

首先第一步就是载入辅助函数: $this->load->helper('form'); 函数解析: 1.form_open() 创建一个开始form标签,相对于你的配置文档中的基础URL.允许你添加一些form属性和一些隐藏表单,并且他会基于你的 config.php 文件里设置的编码,自动生成 accept-charset这个属性. 范例: echo form_open('email/send'); 上面的例子会创建一个form提交至你的基础URL加上"email/send&quo

Nido.Common.Utilities.MD5类

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; namespace Nido.Common.Utilities.MD5 { public class Crypto { static readonly string PasswordHash = "[email prote

System Utilities的解释

System Utilities在UNIX环境高级编程中解释为系统实用程序,真的很难理解.下面是一篇英文,解释了System Utilities的具体意义,先贴上原文地址,然后附上我的译文. 系统实用程序(System Utilities) 系统实用程序就是内核软件的功能.它允许我们使用一种方式去管理你的电脑.而这种方式在外部看来是不可思议地.系统实用程序可能已经包含在了你的电脑中或者从网络上下载好了.不管你在看哪里,你都能毫不费力的找到很多系统使用程序.在这篇文章中,我们来看看几个系统实用程序

【MongoDB学习笔记33】MongoDB副本集rs辅助函数

rs是一个全局的变量,其中那个包含与复制相关的辅助函数,这些函数大多只是数据库命令的包装器,例如 >db.adminCommand({"replSetInitiate":config}) 就和 >rs.initiate(config) 命令是等价的,但是明显后者更容易操作:多了解一下辅助函数还是比较利于操作的. 执行rs.help()可查看可用的辅助函数,如下: spock:PRIMARY> rs.help()            rs.status()    { 

wp8 入门到精通 Utilities类 本地存储+异步

public class CCSetting { public async static void AddOrUpdateValue<T>(string key, T value) { try { if (key != null) { StorageFolder floder = ApplicationData.Current.LocalFolder; if (!(await floder.GetFoldersAsync()).Any(a => a.Name == "DrieS

MySQL Utilities

园子看到使用MySQL对比数据库表结构,参考测试发现 [[email protected] uest]# mysqldiff --server1=dba:[email protected] --server2=dba:[email protected] --changes-for=server2 --show-reverse --difftype=sql test.test1:test.test2 bash: mysqldiff: command not found [[email protec