C++;内置交换两个数值? C++有内置的STL的一部分,交换两个数值而不是做: int tmp = var1; var1 = var2; var2 = tmp;

C++;内置交换两个数值? C++有内置的STL的一部分,交换两个数值而不是做: int tmp = var1; var1 = var2; var2 = tmp;,c++,stl,swap,C++,Stl,Swap,大概是这样的: std::swapValues(var1, var2); 其中SwapValue是一个模板。使用 正如Stephen所说,使用std::swap(var1,var2) 它是一个模板化函数,因此您可以为特定类(如智能指针)提供自己的专业知识,这些类可能具有昂贵的赋值运算符: namespace std { template<> void swap<MySmartPointer>(MySmartPointer& v1, MySmart

大概是这样的:

std::swapValues(var1, var2);
其中SwapValue是一个模板。

使用


正如Stephen所说,使用std::swap(var1,var2)

它是一个模板化函数,因此您可以为特定类(如智能指针)提供自己的专业知识,这些类可能具有昂贵的赋值运算符:

namespace std
{
    template<>
    void swap<MySmartPointer>(MySmartPointer& v1, MySmartPointer& v2)
    {
        std::swap(v1.internalPointer, v2.internalPointer);
    }
}

// ...

std::swap(pointerA, pointerB); // super-fast!!!!1
名称空间std
{
模板
无效交换(MySmartPointer&v1、MySmartPointer&v2)
{
std::swap(v1.internalPointer,v2.internalPointer);
}
}
// ...
std::swap(pointerA,pointerB);//超快!!!!1.

还有Boost-Swap


它克服了目前标准交换实现中的一些限制。如果您想提高类型的效率,您仍然必须提供自己的专门化,但对于如何提供这些专门化,您有更大的自由度。

我同意使用std::swap,但需要注意的是,std::swap使用您正在交换的任何对象的副本构造函数。所以请记住,这对于原始数据类型来说是很好的,但是一旦开始进入更大的结构和类,效率就会降低@C Nielsen,但是你可以使用通常的习惯用法,专门为昂贵的类设置
std::swap
,以避免出现临时问题。如果有更有效的方法,这种较大的对象可能会过载
std::swap
。@C Nielsen,@Alex B,就如何专门设置
std::swap
。谢谢大家,我不会通过编辑关于
swap
specializations的讨论来增加噪音-评论和@tenpn的答案很好地涵盖了它。我还要补充一点,Scott Meyer用有效的C++来覆盖它。()确保阅读问题中的讨论。这是一个很好的方法,但是你必须意识到与之相关的问题。
namespace std
{
    template<>
    void swap<MySmartPointer>(MySmartPointer& v1, MySmartPointer& v2)
    {
        std::swap(v1.internalPointer, v2.internalPointer);
    }
}

// ...

std::swap(pointerA, pointerB); // super-fast!!!!1