码迷,mamicode.com
首页 > 其他好文 > 详细

高效的swap

时间:2014-07-07 19:06:21      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   cti   

原始版本:

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 = 1, int b = 2, int c = 3);
        /*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 = 1, int b = 2, int c = 3) : 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(4,5,6);
    
    a.WidgetPrint();
    b.WidgetPrint();
    
    swap(a, b);
    
    a.WidgetPrint();
    b.WidgetPrint();
    
    int* pinta = new int(5);
    int* pintb = pinta;
    
    
    cout << "*pinta is: " << *pinta << endl;
    cout << "*pintb is: " << *pintb << endl;
    
    return 0;    
}

 

 

高效的swap,布布扣,bubuko.com

高效的swap

标签:style   blog   http   color   os   cti   

原文地址:http://www.cnblogs.com/dracohan/p/3813364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!