按降序排列vector

我应该使用

std::sort(numbers.begin(), numbers.end(), std::greater<int>()); 

要么

 std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators 

按降序排列vector? 一种方法或另一种方法有什么好处或缺点?

其实,第一个是不好的主意。 使用第二个 ,或者这个:

 struct greater { template<class T> bool operator()(T const &a, T const &b) const { return a > b; } }; std::sort(numbers.begin(), numbers.end(), greater()); 

这样,当有人决定numbers应该保持longlong long而不是int时,你的代码不会默默地破坏。

使用第一个:

 std::sort(numbers.begin(), numbers.end(), std::greater<int>()); 

这是明确的发生了什么事情 – 即使有评论,也很less有人误读rbegin 。 这是清晰可读的,这正是你想要的。

此外,第二个可能不如第一个给定反向迭代器的性质,虽然你将不得不分析它是确定的。

那这个呢?

 std::sort(numbers.begin(), numbers.end()); std::reverse(numbers.begin(), numbers.end()); 

根据我的机器,使用第一种方法对long long整型[1..3000000]向量进行sorting需要大约4秒,而使用第二种方法需要大约两倍的时间。 这显然说了些什么,但我不明白为什么。 只是觉得这会有所帮助。

同样的事情在这里报道

正如Xeo所说的那样,用-O3他们大概在同一时间完成。

用C ++ 14,你可以这样做:

 std::sort(numbers.begin(), numbers.end(), std::greater<>()); 

不像Mehrdad提出的仿函数,你可以使用Lambda函数。

 sort(numbers.begin(), numbers.end(), [](const int a, const int b) {return a > b; }); 
 bool comp(int i, int j) { return i > j; } sort(numbers.begin(), numbers.end(), comp); 

第一种方法是指:

  std::sort(numbers.begin(), numbers.end(), std::greater<>()); 

您可以使用第一种方法,因为比第二种方法获得更高的效率。
第一种方法的时间复杂度低于第二种。

我不认为你应该使用这个问题中的任何一种方法,因为它们都是混淆的,而第二个是Mehrdad所说的脆弱的。

我会主张以下内容,因为它看起来像一个标准的库函数,并明确expression了它的意图:

 #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>()); } 

您可以使用第一个或尝试下面的代码,这是同样有效的:

 sort(a,a+n+1,greater<int>());