对一个向量进行降序排序

391

我应该使用什么?

std::sort(numbers.begin(), numbers.end(), std::greater<int>());
或者
std::sort(numbers.rbegin(), numbers.rend());   // note: reverse iterators

如何将向量按降序排序?其中一种方法是否比另一种方法更有优势或劣势?


4
我认为答案很明显,但这个问题有一个有趣的琐事。 :) - wilhelmtell
5
我会选择第一个选项,因为这样我就永远不必再处理“reverse_iterator”了。 - evandrix
4
一个新手问题,为什么第二个例子应该按降序排序?我们将相同的数组作为输入传递给sort方法。只是我们是以相反的顺序传递它,那么为什么应该按降序排序而不是按升序排序,就像使用ar.begin()和ar.end()时一样。 - shshnk
13
@shshnk std::sort(b, e); 将最小值放在 b(在我们的情况下是 rbegin,即 最后 一个元素),将最大值放在 e(在我们的情况下是 rend,即 第一个 元素)。 - fredoverflow
这个回答解决了你的问题吗?将向量元素按降序排序 - Chnossos
12个回答

2

我认为您不应该使用问题中的任何一种方法,因为它们都很令人困惑,而且第二种方法像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>());
}

6
这比仅使用 std::greater 比较器要复杂一千倍... - Apollys supports Monica
@Apollys 我同意从C++14开始,std::greater<>看起来是首选的解决方案。如果您没有C++14,但仍然希望排除std::greater<int>的任何意外情况(例如,在某些时候类型从int变为long),那么它仍然可能非常有用。 - Philipp Claßen

0
对于C++20:
std::ranges::sort(numbers, std::ranges::greater());

这就排除了传入无效的迭代器对的可能性,比如:
std::sort(numbers.end(), numbers.begin(), std::greater<>());
std::sort(numbers.begin(), something_else.end(), std::greater<>());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接