我正在使用C++编写一些字符串排序算法,我想知道是否可以使这个交换操作更快。
void swap(string *items,int a, int b ){
string temp;
temp = items[a];
items[a] = items[b];
items[b] = temp;
}
I'll be appreciate if you can help...
我正在使用C++编写一些字符串排序算法,我想知道是否可以使这个交换操作更快。
void swap(string *items,int a, int b ){
string temp;
temp = items[a];
items[a] = items[b];
items[b] = temp;
}
I'll be appreciate if you can help...
std::string
支持交换,如果你没有 rvalue 引用(即使你有),这可能是最好的解决方案。 - Collin Dauphineestd::swap()
内部执行的操作。 - sthstd::swap()
:void swap(string *items, int a, int b) {
std::swap(items[a], items[b]);
}
但是这并不能保证代码速度会有显著提升,而且这可能也不是你的代码中最慢的部分。你是否测试过与代码其他部分相比,交换操作的性能表现如何呢?
std::swap
更快吗?如果是,为什么?但是最好使用std::swap
,而且没有必要编写自己的包装器,直接调用即可。 - David Heffernanstd::swap
会更快,特别是在C++11中,移动构造器的语义可以比三个赋值运算符更好。 - Greg Hewgillstd::swap
针对字符串进行了重载,并调用了swap
成员函数。根据21.3.5.8保证这是常数时间操作,不会有任何关于移动语义的麻烦。我们无法完全确定它是否比提问者的代码更快,因为可能存在COW或其他优化能将提问者的代码从预期的O(n)
(其中n
是字符串的长度)中解救出来。但这很可能更好,而且肯定不差。 - Steve Jessop使用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
函数将返回传入变量的 rvalue 引用(T&&)。当您尝试分配这个 rvalue 引用时,如果类型有可用的移动操作符,则会调用它。如果没有移动操作符,则像平常一样调用复制操作符。std::string
的情况下,上面的 swap 函数在 C++11 中不会进行字符串拷贝,只会拷贝内部数据,如字符串长度和 C 字符串指针。而没有 C++11,则需要执行三次实际字符串内容的拷贝。std::swap
有一个重载。C++03的21.3.7.8或C++11的21.4.8.8。因此,“没有C++11,它将执行三个实际字符串内容的副本”这种说法是不正确的。 - Steve Jessopstring*
的元素,而不是string
。然后,在你的swap
函数中的所有赋值都将操作指针,并且速度更快,因为不涉及字符串复制。