Quiero tener un stl list
de objetos donde cada objeto contiene dos int
. Después quiero ordenar la lista con stl :: sort después del valor de la primera int
. ¿Cómo le digo a la función de clasificación que se supone que debe ordenar después de la primera int
?Ordenando una lista de un tipo personalizado
Respuesta
Puede especificar un predicado de ordenación personalizado. En C++ 11 esto se hace mejor con una lambda:
typedef std::pair<int, int> ipair;
std::list<ipair> thelist;
thelist.sort([](const ipair & a, const ipair & b) { return a.first < b.first; });
En las versiones anteriores de C++ que tiene que escribir una función apropiada:
bool compFirst(const ipair & a, const ipair & b) { return a.first < b.first; }
thelist.sort(compFirst);
(En cambio, si ipair
por supuesto puede tener su propia estructura de datos; simplemente modifique la función de comparación para acceder al miembro de datos correspondiente)
Finalmente, si esto tiene sentido, también puede equipar su clase personalizada con un operator<
. Eso le permite usar la clase libremente en cualquier contexto ordenado, pero asegúrese de entender las consecuencias de eso.
std :: list :: sort has a one-argument form, siendo el primer argumento la función de comparación.
'std :: sort' tampoco funcionará en' std :: list's ... :-( –
@KerrekSB: Gracias. Algún día buscaré a la persona que decidió que std :: sort no podría solo se especializa para los iteradores de listas, pero se tuvo que incorporar a la clase. – thiton
No. No tiene sentido. La clasificación de listas es totalmente diferente y no tiene nada que ver con los iteradores. El tipo estándar funciona mediante * valores de intercambio * , mientras que el ordenamiento de lista aprovecha la naturaleza del contenedor y simplemente vuelve a enganchar los nodos del elemento. Tenga en cuenta que el ordenamiento de lista no acepta * * un par de iteradores! –
Usted puede hacer algo como esto:
typedef std::pair<int,int>;
list<my_type> test_list;
bool my_compare (my_type a, my_type b)
{
return a.first < b.first;
}
test_list.sort(my_compare);
Si el tipo era una estructura o clase que funcionaría así:
struct some_struct{
int first;
int second;
};
list<some_struct> test_list;
bool my_compare (const some_struct& a,const some_struct& b)
{
return a.first < b.first;
}
test_list.sort(my_compare);
O, alternativamente, se puede definir operator <
para su estructura y solo llame al test_list.sort()
- 1. Ordenando una lista en Prolog
- 2. Ordenando una lista alfabéticamente con un módulo
- 3. Ordenando una lista con pedidoBy
- 4. Ordenando CollectionViewSource usando IComparer personalizado
- 5. Ordenando una lista Comprensión en una declaración
- 6. Ordenando una lista de canciones por Popularidad
- 7. Ordenando una lista de objetos en C#
- 8. Crear una lista distinta de tipo personalizado en C#
- 9. Ordenando una lista con valores nulos
- 10. ¿Cómo eliminar duplicados de una lista basada en un objeto java personalizado no un tipo primitivo?
- 11. Ordenando una lista de números con costo modificado
- 12. Ordenando un ListView por columna
- 13. Ordenando una colección compuesta
- 14. Tipo personalizado python
- 15. Ordenando XML en XSLT basado en una lista de valores
- 16. ordenando un namevaluecollection
- 17. Wordpress - página taxonomía personalizada de tipo lista mensaje personalizado términos
- 18. JavaScriptSerializer con tipo personalizado
- 19. Ordenando una lista en Java usando 2 criterios
- 20. ¿Cómo vinculo una colección (IEnumerable) de un tipo personalizado?
- 21. ¿Crear un tipo de datos XML personalizado?
- 22. ¿Cómo agregar un tipo de mime personalizado?
- 23. C# ordenando una Lista <> usando Tuple?
- 24. Python: cómo hacer un pedido personalizado de una lista?
- 25. Ordenando la lista desplegable usando Javascript
- 26. xsd: Se genera la lista de tipo personalizado en la lista <String>
- 27. Asignación de una lista en hibernación, ordenando en lugar de un índice de campos
- 28. ¿Cómo ordeno una lista genérica basada en un atributo personalizado?
- 29. Ordenando un IList en C#
- 30. Conversión de una lista de tipo base en una lista de tipo heredado
Hola. Estoy usando tu tipo de "versión anterior" pero sigue dejando un elemento sin clasificar: el último elemento en la lista original no se ordena, siempre queda el último elemento. ¿Sabes lo que podría estar mal? Gracias –
@MarcoCastanho: No creo que eso pueda/deba suceder. Parece que tienes un error en alguna parte. Siéntase libre de publicar una pregunta; asegúrese de crear un ejemplo de reproducción * minimal *. –