交换函数,可以避免精度损失。
c++11之前,swap参数列表中其实是赋值操作
template<classT>voidswap ( T& a, T& b ) { T c(a); a=b; b=c; }
由于拷贝构造函数和赋值运算符包含内存拷贝操作,而这样的操作共执行了三次,所以在一个swap中一共存在三次内存拷贝的操作。这种不必要的内存操作很多情况下都会影响C++的执行效率。
C++11之后的swap引入了右值引用和数据移动的概念之后,代码变成下面的样子:
template<classT>voidswap (T& a, T& b) { T c(std::move(a)); a=std::move(b); b=std::move(c); }
std::move将变量类型转换为右值引用,使用内存移管代替了不必要的内存拷贝,因此效率会大大提高。