Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ordenacion de lista stl de struct

Estas en el tema de ordenacion de lista stl de struct en el foro de C/C++ en Foros del Web. Hola, Sabeis como puedo ordenar una lista stl que contiene un struct por un campo determinado.? Gracias....
  #1 (permalink)  
Antiguo 23/12/2012, 15:00
 
Fecha de Ingreso: febrero-2007
Mensajes: 5
Antigüedad: 17 años, 9 meses
Puntos: 0
ordenacion de lista stl de struct

Hola,
Sabeis como puedo ordenar una lista stl que contiene un struct por un campo determinado.?

Gracias.
  #2 (permalink)  
Antiguo 23/12/2012, 18:29
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 9 meses
Puntos: 22
Respuesta: ordenacion de lista stl de struct

Lo más simple es que definas el operador "<" en tu struct y utilices el método sort de la clase list:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. #include <list>
  4. using namespace std;
  5.  
  6. struct Movie{
  7.     string name;
  8.     Movie(const string& _name): name(_name){}
  9.     bool operator<(const Movie& m){
  10.         return name < m.name;
  11.     }
  12. };
  13.  
  14. int main(){
  15.     list<Movie> movies;
  16.  
  17.     movies.push_back(Movie("cMovie"));
  18.     movies.push_back(Movie("aMovie"));
  19.     movies.push_back(Movie("gMovie"));
  20.     movies.push_back(Movie("bMovie"));
  21.  
  22.     movies.sort();
  23.  
  24.     for(list<Movie>::iterator it = movies.begin(); it != movies.end(); it++){
  25.         cout << it->name << endl;
  26.     }
  27.  
  28.     return 0;
  29. }
  #3 (permalink)  
Antiguo 26/12/2012, 18:32
 
Fecha de Ingreso: diciembre-2012
Ubicación: Madrid, pero soy de Las Palmas
Mensajes: 6
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: ordenacion de lista stl de struct

Pero el quiere ordenarla por un campo determinado aqui puedes ver algo parecido que hice pero con una lista de objetos. Basicamente es definir una estructura que evalue la comparación:

https://github.com/adrigm/Generic-Game-Engine/blob/master/src/GGE/Core/Scene.cpp
  #4 (permalink)  
Antiguo 26/12/2012, 19:19
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 11 meses
Puntos: 16
Respuesta: ordenacion de lista stl de struct

Cita:
Iniciado por adrigm Ver Mensaje
Pero el quiere ordenarla por un campo determinado aqui puedes ver algo parecido que hice pero con una lista de objetos. Basicamente es definir una estructura que evalue la comparación:

https://github.com/adrigm/Generic-Game-Engine/blob/master/src/GGE/Core/Scene.cpp
Sugieres lo que ha hecho el compañero fightmx con un ejemplo en su anterior post: tienes un struct y le defines el operador < para compararlos. Después, con el uso de short, los ordena.
Un saludo.
  #5 (permalink)  
Antiguo 27/12/2012, 08:17
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 9 meses
Puntos: 22
Respuesta: ordenacion de lista stl de struct

Ok, ambas formas están bien. El método sort de la clase list está sobrecargado, bien puede utilizarse sin parámetros:
Código C++:
Ver original
  1. myList.sort();
Que es como lo propuse, para ello los objetos contenidos deben tener definido el operador "<" (finalmente la comparación la podemos definir utilizando un campo, dos, otra cosa, etc.). Por eso mencionaba que puede verse como la forma simple ya que no hay necesidad de crear un predicado externo, que es la otra forma de utilizar sort en un list:

Código C++:
Ver original
  1. myList.sort(Compare comp);

Donde comp es un predicado binario (función que recibe dos elementos como parámetros y retorna un booleano), bien se puede utilizar una función objeto (tambien conocido como Functor) como lo utiliza adrigm; o bien, un puntero a una función.

Etiquetas: lista, ordenacion, stl, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:36.