std::swap是一个模板,他提供的是置换操作,即将同一类型对象a,b互换内部值。swap操作要求对象支持copying构造函数和copying赋值函数,在内部操作上,他使用了三个赋值对象。
这里有一个问题,就是对于特定的对象,它的效率会非常的低。所以我们要针对特定的对象进行特殊的swap。
总结:
<!--[if !supportLists]-->1、
<!--[endif]-->如果swap的缺省实现码对你的class或者class template提供可以接受的效率,你不需要额外做任何事情,。
<!--[if !supportLists]-->2、
<!--[endif]-->如果swap缺省实现版的效率不足,试着做下面的事情
<!--[if !supportLists]-->(1)
<!--[endif]-->提供一个public swap函数,让他高效的置换你的类型的两个对象,这个函数不可以抛出异常。这一限制仅限于成员版swap。
<!--[if !supportLists]-->(2)
<!--[endif]-->在你的class或template所在的命名空间内,提供一个non-member swap,并令他调用swap成员函数。
<!--[if !supportLists]-->(3)
<!--[endif]-->如果你正在编写一个class或template,为你的class特化std::swap,并令他们调用你的swap函数。
<!--[if !supportLists]-->3、
<!--[endif]-->如果你调用swap,请确保包含一个using声明式,以便让std::swap在你的函数内曝光可见,然后不叫任何namespace修饰符,赤裸裸的调用swap。
注意:
<!--[if !supportLists]-->1、
<!--[endif]-->当std::swap效率不高时,提供一个swap成员函数,并确保这个函数不抛出异常。
<!--[if !supportLists]-->2、
<!--[endif]-->如果你提供一个members swap,也应该声明一个non-member swap来调用前者,对于classes而非template,也请特化std::swap。
<!--[if !supportLists]-->3、
<!--[endif]-->如果你调用swap,请确保包含一个using声明式,以便让std::swap在你的函数内曝光可见,然后不叫任何namespace修饰符,赤裸裸的调用swap。
<!--[if !supportLists]-->4、
<!--[endif]-->为用户定义类型进行std template全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。
分享到:
相关推荐
C++基础的学习笔记(其中的代码源件可私信留言) C++中的空头程序 使用C++书写hello world 学习变量 学习常量 标识符命名规则 数据类型 运算符 程序流程结构 数组 函数 指针 结构体
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...
条款25:考虑写出一个不抛异常的swap函数 5.实现 条款26:尽可能延后变量定义式的出现时间 条款27:尽量少做转型动作 条款28:避免返回handles指向对象内部成分 条款29:为“异常安全”而努力是值得的 条款30...
如果你知道如何去做,写出高效的 C++ 程序并不特别难。然而,如果不经训练就贸然使用,C++ 也会导致不可理解的,难以维护的,无法扩展的,低效率的,错误百出的代码。 wizardforcel. Effective C++ (Kindle 位置 ...
C++学习笔记--函数指针 函数指针 程序运行期间。每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数入口地址赋给一个指针变量,使该指针变量...
能够实现参数的交换,swap函数利用变量的引用实现
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...
用于对csv表格的基本操作,如添加、修改、删除、排序、插入、设置文件属性等(转)
详细介绍了C#调用C++函数的步骤,经过编译,可以使用
想要彻底理解C++11和C++14,不可止步于熟悉它们引入的语言特性(例如,auto型别推导、移动语义、lambda表达式以及并发支持)。挑战在于高效地运用这些特性——从而使你的软件具备正确性、高效率、可维护性和可移植性...
C++整理笔记word版 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。是01 C++学习笔记的后续补充 内存分区模型 引用 函数提高 类和对象 文件操作
讲述excel函数——Vlookup函数
C++通用异常类 可以获得 抛出异常的行数,函数,所在文件 捕获异常的行数,函数,所在文件
韩顺平Oracle笔记——函数.pptx韩顺平Oracle笔记——函数.pptx
建立一个通用的函数,函数类型和形参不具体指定,用一个虚拟的类型代表。 只要是函数体是相同的就可以用这个模板代替。 (只适用于函数的参数个数相同而类型不同,且函数体一致的情况,如果参数个数不同,则不适用。
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
前端学习——javascript学习笔记(二)函数
Excel函数——信息函数.pdf
Effective C++(编程的50个细节)着重讲解了编写C++程序应该注意的50个细节问题,书中的每一条准则描述了一个编写出更好的C++的方式,每一个条款的背后都有具体范例支持,书中讲的都是C++的编程技巧和注意事项,很多都...