410 votes

Trier un vecteur dans l'ordre décroissant

Dois-je utiliser

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

o

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

pour trier un vecteur dans l'ordre décroissant ? Y a-t-il des avantages ou des inconvénients à l'une ou l'autre de ces approches ?

4 votes

+1 Je pense que la réponse est évidente, mais cette question comporte une partie intéressante de trivium :)

5 votes

Je voterais pour la première option, juste parce qu'ainsi je n'aurais jamais à faire face à reverse_iterator 's.

4 votes

@wilhelmtell Une question de débutant mais pourquoi le deuxième trierait-il par ordre décroissant ? Nous donnons le même tableau comme entrée à la méthode de tri. C'est juste que nous le donnons dans l'ordre inverse, alors pourquoi devrait-il être trié par ordre décroissant et non croissant comme ce serait le cas avec ar.begin() et ar.end.

6voto

Krish Munot Points 874

Vous pouvez utiliser le premier ou essayer le code ci-dessous qui est tout aussi efficace.

sort(&a[0], &a[n], greater<int>());

2voto

Martin Broadhurst Points 3777

Je ne pense pas que vous devriez utiliser l'une ou l'autre des méthodes de la question car elles sont toutes deux confuses, et la seconde est fragile comme le suggère Mehrdad.

Je préconise ce qui suit, car il ressemble à une fonction de bibliothèque standard et son intention est claire :

#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 votes

C'est mille fois plus déroutant que d'utiliser simplement la fonction std::greater comparateur....

0 votes

@Apollys Je suis d'accord qu'à partir de C++14, std::greater<> semble être la solution préférée. Si vous n'avez pas C++14, cela pourrait quand même être utile si vous voulez exclure toute surprise avec std::greater<int> (par exemple, lorsque les types à un moment donné passent de int à long).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X