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 技巧 参考 ...
随机推荐
- openwrt: Makefile 框架分析
openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...
- C++——类继承
类库:类库由类声明和实现构成.类组合了数据表示和类方法,因此提供了比函数库更加完整的程序包. 类继承:从已有的类派生出新的类,派生类继承了原有类(称为基类)的特征,包括方法. 通过类继承可以完成的工作 ...
- 淘宝封装的一款ui 非常不错
好用的淘宝ui http://m.sui.taobao.org/demos/ 手机端访问地址
- IntelliJ IDEA 学习(六)内存设置
小伙伴们经常会发现,在开发的时候,经常遇到内存被占满,导致异常卡顿,有时候提示内存溢出,这时可以通过设置xmx来改善.不过切记最好不要超过内存的1/4 打开 IDEA 安装目录,看到有一个 bin 目 ...
- 网站QQ导航
<a href="http://wpa.qq.com/msgrd?v=3&uin=[color=Red]361983679[/color]&site=qq&me ...
- hiho1099_constellation
题目 一 个NxM(N, M <= 1000)的矩阵形成星空,矩阵中的点有两种字符,'#'代表星星,'.'代表空白,星空中的星星最多5000个:给出K(K<=20)个星图,每 个星图都是H ...
- linux笔记:linux常用命令-权限管理命令
一个文件的权限只有root和所有者可以更改. 权限管理命令:chmod(改变文件或目录的权限) 权限的数字表示: 用权限加减的方式改变权限(u代表所有者,g代表所属组,o代表其他人,a代表所有人): ...
- 33-Url辅助方法
Url辅助方法与HTML辅助方法很类似,HTML辅助方法用来产生HTML标签,而Url辅助方法则负责用来产生Url网址. @Url.Action("About") 最后的输出网址如 ...
- robotframework笔记17
执行测试用例 基本用法 机器人框架从命令行执行测试用例,和 最终的结果是,在默认情况下,一个 输出文件 以XML格式和一个HTML 报告 和 日志 . 执行后,可以组合和输出文件 否则 进行后期处理 ...
- Tomcat卸载
1.以管理员身份打开cmd,执行以下命令: C:Windows\system32>cd C:\Program Files\apache-tomcat-7.0.69\bin C:\Program ...