我应该用
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
or
std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators
按降序对向量排序?这两种方法有什么优点或缺点吗?
我应该用
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
or
std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators
按降序对向量排序?这两种方法有什么优点或缺点吗?
当前回答
第一种方法是指:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
你可以使用第一种方法,因为它比第二种方法效率更高。 第一种方法的时间复杂度比第二种方法小。
其他回答
你可以使用Lambda函数,而不是像Mehrdad建议的那样使用函子。
sort(numbers.begin(), numbers.end(), [](const int a, const int b) {return a > b; });
用c++14你可以这样做:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
根据我的机器,对[1..]使用第一种方法大约需要4秒,而使用第二种方法大约需要两倍的时间。这显然说明了一些问题,但我也不明白为什么。我只是觉得这会有帮助。
这里也报道了同样的事情。
正如Xeo所说,用-O3,它们用相同的时间完成。
我认为你不应该使用问题中的任何一种方法,因为它们都令人困惑,第二种方法正如Mehrdad所说的那样是脆弱的。
我建议使用以下方法,因为它看起来像一个标准的库函数,而且它的意图很明确:
#include <iterator>
template <class RandomIt>
void reverse_sort(RandomIt first, RandomIt last)
{
std::sort(first, last,
std::greater<typename std::iterator_traits<RandomIt>::value_type>());
}
第一种方法是指:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
你可以使用第一种方法,因为它比第二种方法效率更高。 第一种方法的时间复杂度比第二种方法小。