原始版本:

template<typename T>
void swap(T& a, T& b)
{
T tmp(a);
a = b;
b = tmp;
}

此版本不重视效率,当交换的两个对象比较大时,需要更高效的交换,因此应该提供1)public swap成员函数,让它高效的置换两个对象,并提供nono-member swap,调用之

///////////////////////////////////////////////////////////////////////////////
//
// FileName : swap_item25.h
// Version : 0.10
// Author : Ryan Han
// Date : 2013/07/26 13:13:55
// 2013/10/30 08:27:50
// Comment :
// ½«WidgetÉùÃ÷Ò»¸öswapµÄpublicº¯Êý×öÕæÕýµÄÖû»¹¤×÷£¬È»ºó½«std::swapÌØ»¯
/////////////////////////////////////////////////////////////////////////////// #ifndef _SWAP_ITEM25_H_
#define _SWAP_ITEM25_H_ #include <iostream>
using namespace std; class WidgetImpl {
public:
WidgetImpl(int a = , int b = , int c = );
/*WidgetImpl(int a = 1, int b = 2, int c = 3) : x(a), y(b), z(c){
cout << "WidgetImpl constructor called." << endl;
}*/ ~WidgetImpl(){
cout << "WidgetImpl de-constructor called." << endl;
} void WidgetPrint(){
cout << "x = " << x << " y = " << y << " z = "<< z << endl;
}
private:
int x, y, z;
}; class Widget {
public:
Widget(int a = , int b = , int c = ) : pImpl(new WidgetImpl(a, b, c)){
cout << "Widget constructor called." << endl;
;
} ~Widget(){
cout << "Widget de-constructor called." << endl;
delete pImpl;
} Widget(const Widget& rhs) {
pImpl = new WidgetImpl(*(rhs.pImpl));
} Widget& operator=(const Widget& rhs){
*pImpl = *(rhs.pImpl);
} void WidgetPrint(){
pImpl->WidgetPrint();
//non friend class can't access private data
//cout << (*pImpl).x << endl;
} //has to use because only member function could access private member pImpl
void swap(Widget& other){
using std::swap;
swap(pImpl, other.pImpl);
}
private:
WidgetImpl* pImpl;
}; //inline to avoid duplicate definition
//http://www.cnblogs.com/dracohan/p/3401660.html
namespace std {
template <>
inline void swap<Widget>(Widget& a, Widget& b){
cout << "specialized swap was called" << endl;
a.swap(b);
}
} #endif
///////////////////////////////////////////////////////////////////////////////
//
// FileName : swap_item25.cpp
// Version : 0.10
// Author : Ryan Han
// Date : 2013/07/26 13:13:55
// 2013/10/30 08:27:50
// Comment :
//
/////////////////////////////////////////////////////////////////////////////// #include "swap_item25.h"
#include <iostream>
using namespace std; WidgetImpl::
WidgetImpl(int a, int b, int c) : x(a), y(b), z(c){
cout << "WidgetImpl constructor called." << endl;
}
///////////////////////////////////////////////////////////////////////////////
//
// FileName : swap_item25.cpp
// Version : 0.10
// Author : Ryan Han
// Date : 2013/07/26 13:13:55
// 2013/10/30 08:27:50
// Comment :
//
/////////////////////////////////////////////////////////////////////////////// #include "swap_item25.h"
#include <iostream>
using namespace std; int main()
{
Widget a;
Widget b(,,); a.WidgetPrint();
b.WidgetPrint(); swap(a, b); a.WidgetPrint();
b.WidgetPrint(); int* pinta = new int();
int* pintb = pinta; cout << "*pinta is: " << *pinta << endl;
cout << "*pintb is: " << *pintb << endl; return ;
}

C++-高效的swap的更多相关文章

  1. 【原创】C++之自定义高效的swap(1)

    1 问题背景     当交换两个包含了指针成员的类,我们最想看到的是直接交换其指针.但是当我们调用std::swap标准库这个模板函数时,通常它都会复制3个指针指向的对象作为交换所用,缺乏效率.如下: ...

  2. c++下为使用pimpl方法的类编写高效的swap函数

    swap函数是c++中一个常用的函数,用于交换两对象的值,此外还用于在重载赋值运算符中处理自赋值情况和进行异常安全性编程(见下篇),标准模板库中swap的典型实现如下: namespace stl { ...

  3. 读书笔记 effective c++ Item 25 实现一个不抛出异常的swap

    1. swap如此重要 Swap是一个非常有趣的函数,最初作为STL的一部分来介绍,它已然变成了异常安全编程的中流砥柱(Item 29),也是在拷贝中应对自我赋值的一种普通机制(Item 11).Sw ...

  4. 条款25:考虑写出一个不抛出异常的swap函数

    首先说下标准库的swap算法: namespace std{ template<typename T> void swap(T & a, T & b) { T tmp = ...

  5. swap() 函数实现的方法

    swap()函数总结: 一.利用临时变量 1.引用(交换任意类型) template <typename T> void swap(T& x,T& y) { T tmp; ...

  6. linux kernel 如何处理大小端

    暂时在用MPC8309,不太清楚大小端内核是什么时候给转的. 今天看了关于readl和writel具体实现的文章 今天就主要来分析下readl/writel如何实现高效的数据swap和寄存器读写.我们 ...

  7. linux kernel如何处理大端小端字节序

    (转)http://blog.csdn.net/skyflying2012/article/details/43771179 最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的 ...

  8. C++编码优化之减少冗余拷贝或赋值

    临时变量 目前遇到的一些产生临时变量的情况:函数实参.函数返回值.隐式类型转换.多余的拷贝 1. 函数实参 这点应该比较容易理解,函数参数,如果是实参传递的话,函数体里的修改并不会影响调用时传入的参数 ...

  9. C++ 11的移动语义

    目录 可拷贝和可移动的概念 移动构造函数和移动赋值函数 小结移动构造和移动赋值 std::move() 使用 std::move 实现一个高效的 swap 函数 Move and swap 技巧 参考 ...

随机推荐

  1. C\C++头文件说明

    C\C++编程时候经常会遇到头文件问题而出现一系列的调试错误,下面我就简要的举例介绍一下头文件的作用,我们知道一个C\C++ 程序中开头一般都为: #include<iostream.h> ...

  2. 如何用腾讯云打造一款微视频APP

    版权声明:本文由腾讯云原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/196 来源:腾云阁 https://www.qclo ...

  3. vbox下android分辨率设置

    VBoxManage setextradata "android" "CustomVideoMode1" "1280x800x16" 1.  ...

  4. hibernate4.3.10使用注解映射方式样例

    1.调用例子 import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.boot.re ...

  5. Rest接口中正则表达式

    匹配所有字符: @Path("/server/{urlParam: .*}")

  6. selenium+python笔记1

    #!/usr/bin/env python # -*- coding: utf-8 -*- """@desc: 讲讲web项目中常用的方法属性 webdriver 提供了 ...

  7. js二级导航

    js写二级导航要点 1.ul li 2.js获取元素 3.setInterval(function(),time); 代码如下 <style type="text/css"& ...

  8. 编码规范<1>

    目录: 1 排版 2注释 3标识命名 4可读性 1排版 1-1程序使用UTF-8的编码方式 1-2使用空格作为缩进 , 尽量不要使用tab 1-3相对独立的程序块之间,变量说明之后必须加空格 . 例如 ...

  9. ARM字节对齐问题详解

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  10. Android 编程下的代码混淆

    什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...