Ordenar un vector en orden descendente
¿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?
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 numbers
mantener long
o long long
en lugar de int
.
Con c++14 puedes hacer esto:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
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
, begin
incluso 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.
¿Qué pasa con esto?
std::sort(numbers.begin(), numbers.end());
std::reverse(numbers.begin(), numbers.end());