swap函数模板】的更多相关文章

在许多应用程序中,都有交换相同类型的两个变量内容的需要.例如,在对整数数组进行排序时,将需要一个函数来交换两个变量的值,如下所示: void swap(int &a, int &b) { int temp = a; a = b; b = temp; } 在使用中直接  swap( a, b)就可以了…
本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数和函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int& b) { int c = a; a = b; b = c; } 但是这个函数仅仅只能支持int类型,如果我们想实现交换double,float,string等等时,就还需要从新去构造Swap()重载函数,这样不但重复劳动,容易出错,而且还带来很大的维护和调试工作量.更糟的是,还会增加可执行文件的大小.…
比如有一个Base类和一个Derived类,像下面这样: class BaseClass {…}; class DerivedClass : public BaseClass {…}; 因为是父类与子类的关系,所以可以这样写: DerivedClass *d; BaseClass *b = static_cast< BaseClass *>d; // 用C风格直接是 b = (BaseClass*) d; 我们可以弄一个简易的Shared型智能指针类,如果直接像下面这样写: template…
函数模板 函数模板的目的 设计通用的函数,以适应广泛的数据型式 函数模板的定义格式 template<模板型式参数列表>返回值型式 函数名称(参数列表): 原型:template<class T> void Swap(T &a, T&b); 实现:template<class T> void Swap(T &a , T&b){...} 函数模板的体化与特化 针对特定型参数,在声明或第一次调用该函数模板时体化 每次体化都形成针对特定型参数的…
转载地址 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. ,针对int型优化: void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或 因为指…
一.函数重载 因为函数重载比较容易理解,并且非常有助于我们理解函数模板的意义,所以这里我们先来用一个经典的例子展示为什么要使用函数重载,这比读文字定义有效的多. 现在我们编写一个交换两个int变量值得函数,可以这样写: void swap(int & a, int & b) { int tmp; tmp = a; a = b; b = tmp; } 假如我们现在想在与上面函数相同的文件中(可以理解为同一个main函数中)交换两个float变量呢,是不是需要重新整一个函数名,重新定义一个函数…
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 2,针对int型优化: void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或 因为指针是in…
原文来自:http://www.cnblogs.com/xloogson/p/3360847.html 1.C++最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符 template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 2.针对int型优化: void swap(int & __restrict a, int & __restr…
例3.1 传对象不会改变原来对象数据成员值的例子. #define _SCL_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; void swap(string, string);//使用string类的对象作为函数参数 void main() { string str1("现在"), str2("过去");//定义对象str1和str2…
记住: ★当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定其不抛出异常 ★若你提供一个member swap,也该提供一个non-member swap来调用前者.对于classes(而非templates),也请特化std::swap ★调用swap时应针对std::swap使用using声明式,然后调用swap并且不带任何“命名空间资格修饰” ★为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西 --…
(一) 缺省情况下swap动作可由标准程序库提供的swap算法完毕: namespace std { template<typename T> void swap(T& a, T& b) { T temp(a); a = b; b = temp; } } 这个函数是异常安全性编程的核心,而且是用来处理自我赋值可能性的一个常见机制 可是对某些类型而言,这些复制动作无一必要:当中基本的就是"以指针指向一个对象,内含真正数据"那种类型.多为"pimpl手…
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 2,针对int型优化: void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或 因为指针是in…
1.引入 如何编写一个通用加法函数?第一个方法是使用函数重载, 针对每个所需相同行为的不同类型重新实现这个函数.C++的这种编程机制给编程者极大的方便,不需要为功能相似.参数不同的函数选用不同的函数名,也增强了程序的可读性.简单示例: int Add(const int &_iLeft, const int &_iRight) { return (_iLeft + _iRight) ; }f loat Add(const float &_fLeft, const float &am…
我们可以调用std下的swap函数,这是一个模板函数:既可以: ; ; std::swap(a,b); cout<<"a = "<<a<<" b = "<<b<<endl; 也可以(前提这个类型支持复制构造函数和赋值构造函数): class Test { public: Test(int i):val(i){} int getVal(){return val;} private: int val; }; T…
swap函数是c++中一个常用的函数,用于交换两对象的值,此外还用于在重载赋值运算符中处理自赋值情况和进行异常安全性编程(见下篇),标准模板库中swap的典型实现如下: namespace stl { template <typename T> void Swap(T &lhs, T &rhs) { T temp(lhs); lhs = rhs; rhs = temp; } } 缺省版本的Swap函数包含三次对象的复制:lhs复制到temp,rhs复制到lhs,temp复制到r…
0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1.函数模板 1.1 函数模板与泛型编程 C++中有几种交换变量的方法? 交换变量的方法--定义宏代码块 vs 定义函数: 定义宏代码块 优点:代码复用,适合所有的类型 缺点:编译器不知道宏的存在,缺少类型检查 定义函数 优点:真正的函数调用,编译器对类型进行检查 缺点:根据类型重复定义函数,无法代码复…
C++之函数模板与模版函数 直接上代码:  C++ Code  123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104   /*     名称:C…
本文是我用到swap函数时,对其产生好奇,所以结合网上有关博文写下的.个人水平有限,若有错误的地方,欢迎留言指出.谢谢! 一.通用的函数交换模板 template<class T> void swap(T &a,T &b) { T c(a); a=b; b=c; } T为类型,可根据实际需要使用相应的类型 二.针对int类型的优化 使用异或,整数异或本身为结果0:一个数异或0结果为本身: void swap(int &a,int &b) { a^=b; b^=a…
下午写了一份代码: #include <iostream> using namespace std; // 模板1:交换基本类型的值 template<typename T> void swap(T &a, T &b); //模板2:交换两个数组 template<typename T, unsigned N> void swap(T (&a)[N], T(&b)[N]); //模板3:打印数组元素 template<typenam…
首先说下标准库的swap算法: namespace std{ template<typename T> void swap(T & a, T & b) { T tmp = a; a = b; b = tmp; } } 显然的,标准库实在是索然无味,自己随便写都能写出来,而且这样写有时候对于某些来说效率是特别低的.看看下面这个这个例子: class WidgetImpl{ public: ... private: int a, b, c; std::vector<doubl…
通用函数可变参模板 用于处理不限定参数的函数 showall(){//空函数,接口,最后结束递归 } template<typename T,typename... Args> void showall(T value,Args ...args){ cout<<value<<endl; showall(args); } template<typename T,typename ...Args> void showall(const T &value,…
模板声明 template<typename/class T>,  typename比class最近后添加到C++标准. 常规模板,具体化模板,非模板函数的优先调用顺序. 非模板函数(普通函数)> 具体化模板函数 > 常规模板 显示具体化: 具体化表示为某一特定的类型重写函数模板,声明的含义是使用独立的,专门的函数定义显示地为 特定类型生成函数定义. 为什么要有显示具体化?处理模板函数所不能处理的特殊情况.显式具体化显式具体化也是基于函数模板的,只不过在函数模板的基础上,添加一个专…
1 定义: 函数模板 只适用于参数个数相同但是类型不同 而且函数体相同的情况 2 这个例子没有使用模板的情况 #include <iostream> using namespace std; void Swap(int &a, int &b) { int t = a; a = b; b = t; } void Swap(double &a, double &b) { double t = a; a = b; b = t; } int main1() { //lo…
//C++函数模板实例 #include <iostream>template <class Any>void Swap(Any &a, Any &b); int main(){    using namespace std;    double i = 10.123, j = 20.124; Swap(i, j);        cout << "i, j = " << i << " ,"…
泛型编程概念:不考虑具体数据类型的编程方式: 函数模板: 1.提供一种特殊的函数可用不同类型进行调用: 2.与普通函数很相似,区别是类型可被参数化: template <typename T> //template关键字用于声明开始进行泛型编程 void Swap(T &a, T &b) //typename关键字用于声明泛指类型 { T tmp = a; a = b; b = tmp; } 函数模板的应用: 1.自动类型推导调用: 2.具体类型显示调用: int a = 3;…
1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数  模板和类模板就是 C++ 中泛型编程技术,本文分析 C++ 中的模板: 2,每一样技术  的引入都是为了解决一定的问题,下面将通过一个例子让大家意识到问题的存在,才能体会泛型编程的精妙之处: 3,C++ 中有几种交换变量的方法? 1,宏代码块: 2,函数: 4,定义宏代码块 VS 定义函数(全局的): 5,变量的交换编程实验: #includ…
swap函数估计是一个各种各样程序都会频繁用到的子程序,可是你知道它究竟有多少种不同的写法吗?下面我就列举我知道的几种swap函数来跟大家分享一下. (1)经典型---嫁衣法 无论是写程序还是干其他事情,一旦涉及到交换,就总是会遇到第三方.这个第三方可能是公正的监督者,也可能是一个徒为他人做嫁衣的可怜虫.在经典法的交换程序中,我们就需要有一个可怜虫来为我们提供暂时的服务.程序如下: void swap(int *a,int *b){int temp; temp=*a; *a=*b; *b=tem…
1,函数模板深入理解: 1,编译器从函数模板通过具体类型产生不同的函数: 1,模板就是模子,通过这个模子可以产生很多的实物: 2,函数模板就是编译器用来产生具体函数的模子: 2,编译器会对函数模板进行两次编译: 1,对模板代码本身进行编译: 1,检查函数模板本身有无语法错误等: 2,对参数替换后的代码进行编译: 1,调用函数模板的时候,编译器要根据实际的参数类型得到真正的函数,这个时候编译器会对这个函数进行第二次编译: 2,注意事项: 1,函数模板本身不允许隐式类型转换: 1,自动推导类型时,必…
背景 C++ 是很强大,有各种特性来提高代码的可重用性,有助于减少开发的代码量和工作量. C++ 提高代码的可重用性主要有两方面: 继承 模板 继承的特性我已在前面篇章写过了,本篇主要是说明「模板」的特性. 使用「模板」的特性设计,实际上也就是「泛型」程序设计. 函数模板 01 变量交换函数模板 假设我们设计一个交换两个整型变量的值的函数,代码如下: // 交换两个整型变量的值的Swap函数: void Swap(int & x,int & y) { int tmp = x; x = y;…
C++ 常用编程--Swap函数有几种写法? 在说C++模板的方法前,我们先想想C语言里面是怎么做交换的. 举个例子,要将两个int数值交换,是不是想到下面的代码: void swap(int&a , int &b) { int t = a; a=b; b=t; } 如果要求不用临时变量,可考虑异或的方式. void swap(int&a,int&b) { if (&a != &b) { a ^= b; b ^= a; a ^= b; } } 整型数比较容易…