Si tengo un vector de pares:
std::vector<std::pair<int, int> > vec;
¿Hay una manera fácil de ordenar la lista en orden creciente según el segundo elemento del par?
Sé que puedo escribir un pequeño objeto de función que haga el trabajo, pero ¿hay alguna manera de usar las partes existentes de la STL y std::less
hacer el trabajo directamente?
EDITAR: Entiendo que puedo escribir una función o clase separada para pasar al tercer argumento para ordenar. La pregunta es si puedo o no construirlo a partir de material estándar. Realmente tengo algo que se parece a:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
Respuestas:
EDITAR : usando c ++ 14, la mejor solución es muy fácil de escribir gracias a lambdas que ahora puede tener parámetros de tipo
auto
. Esta es mi solución favorita actualSimplemente use un comparador personalizado (es un tercer argumento opcional para
std::sort
)Si está utilizando un compilador de C ++ 11, puede escribir lo mismo con lambdas:
EDITAR : en respuesta a sus ediciones a su pregunta, aquí hay algunos pensamientos ... si realmente quiere ser creativo y poder reutilizar mucho este concepto, simplemente haga una plantilla:
entonces puedes hacer esto también:
o incluso
Aunque para ser honesto, todo esto es un poco exagerado, solo escriba la función de 3 líneas y termine con ella :-P
fuente
operator<
adentropair<T1,T2>
. El comparador predeterminado usa el primer y el segundo elemento (en caso de que los primeros sean iguales). Aquí solo se está utilizando el segundo."is there and easy way to sort the list in increasing order based on the second element of the pair?"
Puedes usar boost así:
No conozco una forma estándar de hacer esto igualmente corto y conciso, pero puedes elegir
boost::bind
que todo consiste en encabezados.fuente
Es bastante simple que use la función de clasificación del algoritmo y agregue su propia función de comparación
Ahora tiene que hacer la comparación basada en la segunda selección, así que declare "myComparison" como
fuente
Con C ++ 0x podemos usar funciones lambda:
En este ejemplo, el tipo de retorno
bool
se deduce implícitamente.Tipos de retorno de lambda
Cuando una función lambda tiene una sola declaración, y esta es una declaración de retorno, el compilador puede deducir el tipo de retorno. De C ++ 11, §5.1.2 / 4:
Para especificar explícitamente el tipo de retorno, use el formulario
[]() -> Type { }
, como en:fuente
if (lhs.second == 0)
?lhs.second < rhs.second
puede regresartrue
ofalse
y el compilador puede deducir claramentebool
. Solo quería demostrar el[]() -> Type { }
caso.Por algo reutilizable:
Puedes usarlo como
o
fuente
Tendría que confiar en un select2nd no estándar
fuente
Intente intercambiar los elementos de los pares para que pueda usarlos
std::sort()
normalmente.fuente