我如何使交换功能更快在c++

How can I make swap function faster in c++ ?

本文关键字:c++ 功能 何使 交换      更新时间:2023-10-16

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

void swap(string *items,int a, int b ){
        string temp;
        temp = items[a];
        items[a] = items[b];
        items[b] = temp;
}
如果你能帮忙,我会很感激的。

String类有自己的swap函数

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

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

您可以使用std::swap():

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

但是不能保证这一定会更快,而且这可能不是代码中慢的部分。与其他代码相比,您是否测量过交换操作的性能?

使用std::swap;它将尽其所能。如果您的编译器支持c++ 11的右值引用,这意味着它将利用move语义来避免在swap函数中发生的复制。

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

大多数标准库实现将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&&)。当您尝试赋值这个右值引用时,它将调用该类型的move操作符(如果有的话)。如果移动操作符不可用,它将像往常一样调用复制操作符。

std::string的情况下,上述交换函数将不会在c++ 11中进行字符串复制;只有内部数据,如字符串长度和C字符串指针,将被复制。如果没有c++ 11,它将执行实际字符串内容的三份拷贝。

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