我应该用

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

or

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

按降序对向量排序?这两种方法有什么优点或缺点吗?


当前回答

用c++14你可以这样做:

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

其他回答

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

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

这里也报道了同样的事情。

正如Xeo所说,用-O3,它们用相同的时间完成。

使用第一个:

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

它清楚地显示了正在发生的事情——将rbegin误读为begin的可能性更小,甚至带有注释。它清晰易读,这正是你想要的。

另外,考虑到反向迭代器的性质,第二个迭代器的效率可能比第一个要低,尽管您必须对它进行分析以确定。

这个呢?

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

事实上,第一个不是个好主意。可以用第二个,也可以用这个:

struct greater
{
    template<class T>
    bool operator()(T const &a, T const &b) const { return a > b; }
};

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

这样,当有人决定数字应该保持long或long long而不是int时,您的代码就不会无声地中断。