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 技巧 参考 ...
随机推荐
- ElasticSearch(ES)和solr的关系和区别
可以参考这篇文章:http://www.cnblogs.com/chowmin/articles/4629220.html Solr 2004年诞生(当时是Solar). ElasticSearch ...
- 【Todo】单例模式各种实现方式及并发安全
Java 40道面试题不错:http://www.tuicool.com/articles/VRVFZb 其中有一道题目: 单例模式的线程安全性 老生常谈的问题了,首先要说的是单例模式的线程安全意味着 ...
- Object Pascal 运算符
Object Pascal 的运算符 运算符是程序代码中对各种类型的数据进行计算的符号,通常分为算数运算符.逻辑运算符.比较运算符和按位运算符. 1.算术运算符Object Pascal ...
- Object Pascal 方法与技巧
4 方法与技巧 4.1 设置代码模板 代码模板是Delphi 的代码感知特性的一种,通过它可以快速.高效和正确地输入代码.代码模板将一些常用的语句块保存在模板中,然后程序员只要在代码编辑器中按下“Ct ...
- The new day of my blog
今天开始了我的博客建造之旅,作为一个ACMer(虽说是弱校的),我也想象其他人一样把自己的题解和心得记录下来,一来可以和大家分享一下,二来也可以留给将来的自己作回顾,希望众大神能够给以指导指导,让我这 ...
- 记录一下表格用poi的导出word
也是网上找的代码http://53873039oycg.iteye.com/blog/2152009,但是横向合并单元格没成功.只能用很蠢的办法建立了好多table public void fillT ...
- scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name
假设Student类如下: class Student { private int no; private String name; public int getNo() { return no; } ...
- 20160815_设置静态IP
1.CentOS6.4x64里面默认没有文件"/etc/sysconfig/network-scripts/ifcfg-eth0"(还是 是有的,但是默认为空??以后再看吧...) ...
- hiho_1062_最近公共祖先
题目大意 给出一棵家谱树,树中的节点都有一个名字,保证每个名字都是唯一的,然后进行若干次查询,找出两个名字的最近公共祖先. 分析 数据量较小,对于每次查询都进行如下操作: 先找出person1到达根节 ...
- Sun Grid Engine (SGE)大型集群作业调度系统
Oracle Grid Engine 作业调度系统的简介(目前为止我用过PBS和SGE) SGE作业调度系统学习笔记 SGE作业调度 USE of Sun Grid Engine(SGE) 待续~