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

条款25: 考虑写出一个不抛异常的swap函数 1、内容引出 swap()属于STL的一部分(算法),而后成为异常安全性编程的脊柱,以及用来处理自我赋值的可能性的一个常见的机制。它是如此的有用,适当的实现就显得十分重要。然而在它的实现的复杂度也比较高。这个条款就在讲swap()函数的实现问题。 2、 widget 和widgetImpl 都是class时,如何写出高效的swap() STL 缺省情况下,由STL提供的swap算法完成,如下: n... 阅读详情

一、全特化与偏特化

特化的意义:对于特定类型如果你有更好的方式实现,就应该由你来实现。
全特化:指定模板的每个数据类型
偏特化:只指定模板中某些数据类型
1、类的全特化和偏特化
#include <iostream>

using namespace std;

template<typename TYPE1, typename TYPE2>
class myClass
{
public:
	myClass(TYPE1 i, TYPE2 j):a(i), b(j){cout<<"这是类模板"<<endl;}
	
private:
	TYPE1 a;
	TYPE2 b;
};

template<>
class myClass<int, char>
{
public:
	myClass(int i, char j):a(i), b(j){cout<<"这是上述类的全特化"<<endl;}
private:
	int a;
	char b;
};

template<typename TYPE2>
class myClass<int, TYPE2>
{
public:
	myClass(int i, TYPE2 j):a(i), b(j){cout<<"这是上述类的偏特化"<<endl;}
private:
	int a;
	TYPE2 b;
};

int main()
{
	myClass<double, float> obj1(1.0,2.0);   //调用类模板 
	myClass<int, char> obj2(1,'c');         //调用全特化 
	myClass<int, double> obj3(1, 2.0);      //调用偏特化 
	return 0;
}

2、函数的全特化
#include <iostream>

using namespace std;

template<typename TYPE1, typename TYPE2>
void myFunction(TYPE1 a, TYPE2 b)
{
	cout<<"这是函数模板"<<endl;
}

template<>
void myFunction<int, char>(int a, char b) 
{
	cout<<"这是上述函数模板的全特化"<<endl;
}

//template<typename TYPE2>
//void myFunction<int, TYPE2>(int a, TYPE2 b)
//{
//	cout<<"这是上述函数模板的偏特化"<<endl; 
//}


int main()
{
	myFunction(1.0, 2.0);  //调用函数模板 
	myFunction(1, 'c');    //调用函数全特化 
	myFunction(1, 1.0);    //调用函数模板 
	return 0;
}

注意:函数不可以偏特化,其功能可以通过函数重载实现。

二、swap函数

1、具体的类情况下如何设计swap函数
#include <iostream>

using namespace std;

class myClassImpl
{
public:
	myClassImpl(int i):val(i){}
	int getVal(){return val;}

private:
	int val;
};

//具体类
class myClass
{
public:
	myClass(int i):p(new myClassImpl(i)){}
	~myClass(){delete p;}
	myClass operator=(const myClass rhs)
	{
		*p = *(rhs.p);
	}
	int getVal()
	{
		return p->getVal();
	}
	void swap(myClass& other)
	{
		using std::swap;
		swap(p, other.p);
	}
	
private:
	myClassImpl* p;
};

//全特化std中的swap函数
namespace std
{
	template<>
	void swap<myClass>(myClass& a, myClass& b)
	{
		a.swap(b);
	} 
} 

int main()
{
	myClass a(1);
	myClass b(2);
	cout << a.getVal() << " " << b.getVal() << endl;
	swap(a,b);
	cout << a.getVal() << " " << b.getVal() << endl;
	return 0;
}

2、模板类的情况下如何设计swap函数
</pre><pre name="code" class="cpp">#include <iostream>

using namespace std;

namespace mySpace
{
	
template<typename TYPE>
class myClassImpl
{
public:
	myClassImpl(TYPE i):val(i){}
	TYPE getVal(){return val;}

private:
	TYPE val;
};

//模板类
template<typename TYPE>
class myClass
{
public:
	myClass(TYPE i):p(new myClassImpl<TYPE>(i)){}
	~myClass(){}
	TYPE operator=(const myClass rhs)
	{
		*p = *(rhs.p);
	}
	TYPE getVal()
	{
		return p->getVal();
	}
	void swap(myClass& other)
	{
		using std::swap;
		swap(p, other.p);
	}
private:
	myClassImpl<TYPE>* p;
};

//函数模板不能偏特化,通过重载swap函数实现 
template<typename TYPE>
void swap(myClass<TYPE>& a, myClass<TYPE>& b) 
{
	a.swap(b);
}
}

int main()
{
	mySpace::myClass<int> a(1);
	mySpace::myClass<int> b(2);
	cout << a.getVal() << " " << b.getVal() << endl;
	mySpace::swap(a,b);
	cout << a.getVal() << " " << b.getVal() << endl;
	return 0;
}

参考: http://blog.youkuaiyun.com/thefutureisour/article/details/7965591



QCC51XX---人机接口设备协议( HID) 阅读详情

相关推荐

R语言 下载包出错Warning: 无法在貯藏處https://cloud.r-project.org/src/contrib中读写索引:

报错原因,竟然是ie浏览器的问题,unbelievable 1、在R中,下载包的时候,却发现报错:Warning: 无法在貯藏處https://cloud.r-project.org/src/contrib中读写索引: 无法打开URL'https://cloud.r-project.o 2、后来针对CRAN重新选择,但以下这几个都选择了一遍。都还是报错。 3、最后找到原因了。下载包是依赖本机的ie浏览器下载的。本身电脑 的ie浏览器出错了,打开是网页显示 打不开的。所以导致下...

2万+

C++ 不抛出异常的swap()函数的写法

20180314 C++ 不抛出异常的swap()函数的写法swap函数交换两对象的值,缺省情况下,swap动作由标准程序库提供的swap算法完成,其实现为:namespace std{ template&lt;typename T&gt; void swap(T&amp; a,T&amp; b)  {    Ttemp(a);    a= b;    b= temp;  }}只要类型T支持拷贝(...

weixin_39089680的博客 644

微信小程序订阅消息实战:如何绕过长期订阅限制实现多次发送(附PHP代码)

本文针对微信小程序开发者无法获取长期订阅消息权限的痛点,提供了一套完整的实战解决方案。通过深入剖析一次性订阅与长期订阅的规则差异,结合巧妙的交互设计、稳健的PHP服务端发送引擎(含高并发处理与失败重试机制)以及授权池管理等高级策略,帮助开发者在合规前提下,构建高可用的消息推送系统,有效提升通知触达率与用户体验。

weixin_29008805的博客 628

《Effective C ++ 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

swap交换函数是常用的函数,在STL中有实现,但是未必高效。本条款讲解的是,怎么写一个兼容STL的、高效的swap函数。

KangRoger的专栏 2662

不用编码器也能玩转BLDC?手把手教你反电动势定位实战

本文详细介绍了无刷直流电机(BLDC)的无传感器控制方案——反电动势定位法,通过STM32实战演示如何实现基本控制。文章涵盖核心原理、硬件准备、信号采集技巧及代码实现,特别适合静音风扇、小型机器人等对成本敏感的应用场景,帮助开发者降低硬件成本并提升系统可靠性。

lg888的博客 900

基于STM32F4的NRF24L01驱动程序

基于STM32F4xx的NRF24L01驱动程序 提示:硬件平台基于STM32F427VIT6、NRF24L01模块 文章目录基于STM32F4xx的NRF24L01驱动程序前言一、NRF24L01简单介绍1,什么是NRF24L012,NRF24L01通信方法3,NRF24L01通信原理4,地址分配&通道分配问题二、STM32CubeMX配置三、添加底层文件1,添加.c/.h文件到工程中2,使用说明四,下载 前言 提示:本例程采用STM32CubeMX配置底层,采用硬件SPI方式驱动NRF24

qq_43603289的博客 2815

Effective C++(一个不抛出异常的swap函数)

author: luixiao1223 title: 一个不抛出异常的swap函数 来看标准STL版本的swap namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a = b; b = temp; ...

luixiao1220的博客 259

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 412

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

考虑如下代码 class WidgetImp1 { //针对Widget数据设计的class,细节不重要 public: //... private: int a, b, c; std::vector<double> v; }; class Widget { public: Widget(const Widet& rhs); Widget& operator=(const Widget& rhs) { //... *pImpl = *(rhs.pI

L_H_L的博客 223

Ubuntu22.04安装搜狗输入法踩坑实录:从依赖报错到完美解决的完整指南

本文详细解析了在Ubuntu 22.04系统上安装搜狗拼音输入法的完整流程,从解决依赖报错到配置fcitx框架,再到最终优化使用体验。针对常见的dpkg安装错误和fcitx冲突问题,提供了实用的解决方案和命令,帮助用户顺利完成安装并享受流畅的中文输入体验。

palm99的专栏 975

KVM — 与 QEMU 和 Libvirt 的关系

目录目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用前言如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会有所混淆, 傻傻的分不清. 尤其在看虚拟化技术文档时导致理解能力下降, 所以在开始学习虚拟化技术之前对这些概念有一个整体的认识和清晰的理解, 就显得很有必要了.KVMKVM(Kernel-basedVirtu

烟云的计算 5739

Effective C++——》条款25:考虑写一个不抛出异常的swap函数

我也不知道为什么作者给这个条款起这样的名字,因为这样看上去重点是在“不抛出异常”,但事实上作者只是在全文最后一段说了一下不抛异常的原因,大部分段落是在介绍怎样写一个节省资源的swap函数。 你可以试一下,只要包含了头文件iostream,就可以使用swap函数,比如: 1 #include 2 3 int main() 4 { 5 int a = 3; 6 in

liuxiaomao1988的专栏 568

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 142

条款25 考虑写一个不抛出异常的swap

见 effective c++ 的 条款25 (个人知识点总结) 1、当std::swap 对你的类型不高时,提供一个swap成员函数,并确定这个函数不抛出异常 2、如果提供一个member swap, 也请提供一个non-member swap用来调用前者。对于class(而非template),也请特化std::swap. 3、调用swap时应针对std::swap 使用using声明,...

记录一些事情 205

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Effective C++条款25:设计与声明之(考虑写出一个不抛异常的swap函数)

待续

董哥的黑板报 1043

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[Effective C++]条款25 考虑写出一个不抛异常的swap函数

swap是一个有趣的函数, 原本它只是STL的一部分, 而后成为了异常安全性编程中的脊柱, 有关异常安全性我在条款11中介绍过, 在之后的条款29中也将着重着墨. 由于swap相当有用, 适当的实现非常重要, 好的swap设计可以带来非凡的效率提升, 本条款将着重描写如何写一个合格的swap函数.

tianmu_sama的博客 724

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Effective C++ 条款25:考虑写一个不抛异常的 swap 函数

深入理解 C++ swap 函数的设计哲学,掌握自定义 swap 实现异常安全与性能优化的关键技术

凡人叶枫的博客 218

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

swap是个有趣的函数,原本它只是STL的一部分,而后成为异常安全编程的基石,以及用来处理自我赋值可能性的一个常见机制。由于swap功能如此强大,适当的实现很重要。然而在非凡的重要性之外它也带来了非凡的复杂度。所谓swap两对象值,意思是将两对象的值彼此赋予对方。缺省情况下swap动作可由标准程序库提供的swap算法完成。只要类型T支持copying(通过copy构造函数和copy assignment操作符完成),缺省的swap实现代码就会帮你置换类型为T的对象,不需要为此做另外的工作。

依然爱猪的博客 492

Effective C++之条款25:考虑写出一个不抛出异常的swap函数

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款25:考虑写出一个不抛出异常的swap函数 Consider support for a non-throwing swap. swap是个有趣的函数。原本它只是STL的一部分,而后成为异常安全性编程(exce...

HakunaMatata的博客 275

Effective C++ 学习笔记 条款25 考虑写出一个不抛异常的swap函数

因此当你写下一个自定版本的swap,往往提供的不只是高效置换对象值的办法,而且不抛出异常(因为调用的是成员版的swap)。不幸的是有一个理由使你应该为class特化std::swap(很快会描述它),所以如果你想让你的“class专属版”swap在尽可能多的语境下被调用,你需得同时在该class所在命名空间内写一个non-member版本以及一个std::swap特化版本。首先,如果swap的缺省实现码对你的class或class template提供可接受的效率,你不需要额外做任何事。

tus00000的博客 837

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

swap是个有趣的函数。原本它只是STL的一部分,而后成为异常安全性编程(exception-safe programing,见条款29)的脊柱,以及用来处理自我赋值可能性(见条款11)的一个常见机制。由于swap如此有用,适当的实现很重要。 所谓swap(置换)两对象值,意思是将两对象的值彼此赋予对方。缺省情况下swap动作可由标准程序库提供的swap算法完成。...

yj_android_develop的博客 329

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

条款 25 :考虑写出一个不抛出异常的swap函数 Consider support for a non-throwing swap. 所谓swap(置换)两对象值,意思是将两对象的值彼此赋予对方。标准库缺省swap函数典型实现如下: namespace std{ template<typename T> void swap(T& a,T& b){ T temp(a); a=b; b=temp; } } 在上述代码中只要类型T支持copying,缺省的swa

weixin_45730130的博客 261

Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数

【代码】Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数。

weixin_42255569的博客 587

Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数

我也不知道为什么作者给这个条款起这样的名字,因为这样看上去重点是在“不抛出异常”,但事实上作者只是在全文最后一段说了一下不抛异常的原因,大部分段落是在介绍怎样写一个节省资源的swap函数。 你可以试一下,只要包含了头文件iostream,就可以使用swap函数,比如: #include <iostream> int main() { int a = 3; int...

Likes的博客 318

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

本条款名字虽然在说“不抛异常”,然而内容重点却在正确的设计swap使得更高效、节省资源! 首先,swap标准程序库定义: template<typename T> void swap(T& a, T& b) { T tmp(a); a = b; b = tmp; } 然而,这种复制的成本对于某些class没有必要,我们这里来看...

sgh666666的博客 273

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

文章目录pimple手法——136swap特化——138不能偏特化function template——139调用swap可以针对std::swap使用using声明式,然后调用swap不可带任何空间修饰符——140总结——142 缺省情况下swap的实现如下: namespace std{ template<typename T> void swap(T& a...

缇珞的博客 271
上一篇: 红黑树
下一篇: 堆内存和栈内存详解
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值