如何在c ++中实现交换

时间:2010-10-10 15:24:56

标签: c++ metaprogramming

我刚开始学习元编程,我想知道swap的实现。 任何人都可以帮助我解释元编程中的特征吗?感谢。

2 个答案:

答案 0 :(得分:10)

来自std::swap

<algorithm>被实现为模板,因此它可以交换任何给定类型的两个变量的值。它的原型看起来像这样:

template <typename T> void swap(T& a, T& b);

典型的实现是将一个值保存在临时值中,将第二个值复制到第一个变量,然后将临时值放入第二个变量中。在C ++中,这涉及复制构造函数和赋值运算符。

对于大型物体,所有这些构造和复制都很昂贵。包括大多数(全部?)STL容器在内的许多对象都有一个重载的实现,它可以通过交换一些指针值来实现。交换指针非常快,它避免了任何潜在的失败(如复制构造函数中的内存分配)。重载std::swap转发到成员函数(通常也称为swap)。成员函数可以访问内部,因此它可以使用更有效的方法。重载可能看起来像这样(简化):

template <typename T> void swap<vector<T> >(vector<T>& a, vector<T>& b) {
  a.swap(b);
}

如果您想查看真实代码,可以浏览编译器和操作系统的std头文件。

答案 1 :(得分:3)

来自http://www.cplusplus.com/reference/algorithm/swap/

此功能模板的行为等同于:

template <class T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}