我正在用c ++编写一个字符串排序算法,我想知道我是否可以更快地进行这种交换操作。
void swap(string *items,int a, int b ){
string temp;
temp = items[a];
items[a] = items[b];
items[b] = temp;
}
如果你能提供帮助,我将不胜感激......
答案 0 :(得分:20)
答案 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
函数中的所有赋值都将对指针进行操作,并且速度更快,因为不会涉及字符串复制。