如何在c ++中更快地交换函数?

时间:2011-11-24 19:02:15

标签: c++ algorithm sorting

我正在用c ++编写一个字符串排序算法,我想知道我是否可以更快地进行这种交换操作。

void swap(string *items,int a, int b ){
        string temp;
        temp = items[a];
        items[a] = items[b];
        items[b] = temp;
}

如果你能提供帮助,我将不胜感激......

4 个答案:

答案 0 :(得分:20)

String类有自己的交换函数。

items[a].swap(items[b]);

这是最快的方法,因为它访问字符串内部并避免所有复制。

请参阅here

答案 1 :(得分:9)

您可以使用std::swap()

void swap(string *items, int a, int b) {
    std::swap(items[a], items[b]);
}

但是不能保证这个速度会快得多,而且这可能不是你代码的缓慢部分。您是否测量过交换操作与其余代码相比的性能?

答案 2 :(得分:6)

使用std::swap;它会尽力而为。如果您的编译器支持C ++ 11的右值引用,这意味着它将利用移动语义来避免交换函数中出现的副本。

但是,如果您的编译器不支持右值引用,它很可能与交换函数的执行方式相同。

大多数标准库实现都会将std::swap实现为类似于:

template<typename T>
void swap(T& a, T& b) {
    T temp(std::move(a));
    a = std::move(b);
    b = std::move(temp);
}

std::move函数将向传入的变量返回右值引用(T&amp;&amp;)。当您尝试分配此右值引用时,它将调用类型的移动运算符(如果有)。如果移动操作符不可用,它将照常调用复制操作符。

对于std::string,上述交换函数不会使用C ++ 11进行字符串复制;只复制内部数据,如字符串长度和C字符串指针。如果没有C ++ 11,它将执行实际字符串内容的三个副本。

答案 3 :(得分:4)

您可以更改算法以处理string*类型的元素而不是string。然后,swap函数中的所有赋值都将对指针进行操作,并且速度更快,因为不会涉及字符串复制。