Ordenar un vector en orden descendente

Resuelto fredoverflow asked hace 12 años • 12 respuestas

¿Debería usar

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

o

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

ordenar un vector en orden descendente? ¿Existen ventajas o desventajas con un enfoque u otro?

fredoverflow avatar Jan 27 '12 03:01 fredoverflow
Aceptado

En realidad, la primera es una mala idea. Utilice el segundo o este:

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

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

De esa manera, su código no se romperá silenciosamente cuando alguien decida numbersmantener longo long longen lugar de int.

user541686 avatar Apr 28 '2013 20:04 user541686

Con c++14 puedes hacer esto:

std::sort(numbers.begin(), numbers.end(), std::greater<>());
mrexciting avatar Jun 10 '2016 21:06 mrexciting

Utilice el primero:

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

Es explícito de lo que está sucediendo: menos posibilidades de malinterpretar rbegin, beginincluso con un comentario. Es claro y legible, que es exactamente lo que desea.

Además, el segundo puede ser menos eficiente que el primero dada la naturaleza de los iteradores inversos, aunque habría que perfilarlo para estar seguro.

Pubby avatar Jan 26 '2012 20:01 Pubby

¿Qué pasa con esto?

std::sort(numbers.begin(), numbers.end());
std::reverse(numbers.begin(), numbers.end());
shoumikhin avatar Sep 10 '2015 04:09 shoumikhin