ibr*_*him 6 c++ sorting algorithm
我正在用c ++编写一个字符串排序算法,我想知道我是否可以更快地进行这种交换操作.
void swap(string *items,int a, int b ){
string temp;
temp = items[a];
items[a] = items[b];
items[b] = temp;
}
Run Code Online (Sandbox Code Playgroud)
如果你能提供帮助,我将不胜感激......
Ant*_*ima 20
String类有自己的swap函数.
items[a].swap(items[b]);
Run Code Online (Sandbox Code Playgroud)
这是最快的方法,因为它访问字符串内部并避免所有复制.
看到这里.
你可以使用std::swap()
:
void swap(string *items, int a, int b) {
std::swap(items[a], items[b]);
}
Run Code Online (Sandbox Code Playgroud)
但是不能保证这会快得多,而且这可能不是你代码的缓慢部分.您是否测量过交换操作与其余代码相比的性能?
使用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);
}
Run Code Online (Sandbox Code Playgroud)
该std::move
函数将向传入的变量返回右值引用(T &&).当您尝试分配此右值引用时,它将调用类型的移动运算符(如果有).如果移动操作符不可用,它将照常调用复制操作符.
在这种情况下std::string
,上面的交换函数将不会使用C++ 11进行字符串复制; 只复制内部数据,如字符串长度和C字符串指针.如果没有C++ 11,它将执行实际字符串内容的三个副本.