C++-高效的swap
原始版本:
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的更多相关文章
- 【原创】C++之自定义高效的swap(1)
1 问题背景 当交换两个包含了指针成员的类,我们最想看到的是直接交换其指针.但是当我们调用std::swap标准库这个模板函数时,通常它都会复制3个指针指向的对象作为交换所用,缺乏效率.如下: ...
- c++下为使用pimpl方法的类编写高效的swap函数
swap函数是c++中一个常用的函数,用于交换两对象的值,此外还用于在重载赋值运算符中处理自赋值情况和进行异常安全性编程(见下篇),标准模板库中swap的典型实现如下: namespace stl { ...
- 读书笔记 effective c++ Item 25 实现一个不抛出异常的swap
1. swap如此重要 Swap是一个非常有趣的函数,最初作为STL的一部分来介绍,它已然变成了异常安全编程的中流砥柱(Item 29),也是在拷贝中应对自我赋值的一种普通机制(Item 11).Sw ...
- 条款25:考虑写出一个不抛出异常的swap函数
首先说下标准库的swap算法: namespace std{ template<typename T> void swap(T & a, T & b) { T tmp = ...
- swap() 函数实现的方法
swap()函数总结: 一.利用临时变量 1.引用(交换任意类型) template <typename T> void swap(T& x,T& y) { T tmp; ...
- linux kernel 如何处理大小端
暂时在用MPC8309,不太清楚大小端内核是什么时候给转的. 今天看了关于readl和writel具体实现的文章 今天就主要来分析下readl/writel如何实现高效的数据swap和寄存器读写.我们 ...
- linux kernel如何处理大端小端字节序
(转)http://blog.csdn.net/skyflying2012/article/details/43771179 最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的 ...
- C++编码优化之减少冗余拷贝或赋值
临时变量 目前遇到的一些产生临时变量的情况:函数实参.函数返回值.隐式类型转换.多余的拷贝 1. 函数实参 这点应该比较容易理解,函数参数,如果是实参传递的话,函数体里的修改并不会影响调用时传入的参数 ...
- C++ 11的移动语义
目录 可拷贝和可移动的概念 移动构造函数和移动赋值函数 小结移动构造和移动赋值 std::move() 使用 std::move 实现一个高效的 swap 函数 Move and swap 技巧 参考 ...
随机推荐
- Lua了解 & 为什么游戏开发用Lua
参考这篇文章 https://www.zhihu.com/question/21717567 看来就是网易风云为了让人写外挂不方便而采用的冷门语言.当然冷门的语言不代表不好用啦. Lua 虚拟机小,嵌 ...
- Android开发中退出程序几种方法
参考:http://johncookie.iteye.com/blog/890734 Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗 ...
- iOS开发之 在release版本禁止输出NSLog内容
因为NSLog的输出还是比较消耗系统资源的,而且输出的数据也可能会暴露出App里的保密数据,所以发布正式版时需要把这些输出全部屏蔽掉. 我们可以在发布版本前先把所有NSLog语句注释掉,等以后要调试时 ...
- [js] 非常好的面试题,学习了。。
原文链接:http://www.cnblogs.com/xxcanghai/p/5189353.html
- Activity中与ListActivity中使用listview区别
Activity中与ListActivity中使用listview区别 一.Activity中与ListActivity中使用listview区别(本身没多大区别,只是ListActivity在lis ...
- 面向对象的static关键字(类中的static关键字)
转自:http://blog.csdn.net/xiayefanxing/article/details/7382192 http://www.cnblogs.com/SelaSelah/archiv ...
- git服务器搭建-new
http://blog.chinaunix.net/uid-26729093-id-4652536.html 基本命令使用:http://www.cnblogs.com/xdao/p/linux_gi ...
- phalcon:model 事件与事件管理器
事件与事件管理器(Events and Events Manager)¶ Models allow you to implement events that will be thrown when p ...
- perl 语法速查
同时学perl.python和shell脚本会很容易将它们的语法搞混,本文主要是一个个人的总结,方便要用时的查询. perl基本语法.安装.帮助文档 文件头格式: #!/usr/bin/perl us ...
- dom event无法获取问题
下列几种情况下无法获取到event,ff浏览器没测试. 1.a标签href调用的js事件 2.调用parent中事件,即子窗口调用父窗口页面中js 3....