Ordenar una lista (list)

16/12/2004 - 13:16 por Sergio | Informe spam
Como se puede hacer que una lista basada en stl sea ordenada con sort?

typedef struct tagESPECIAL {
list<int> jugadores;
list<evespecial>::iterator tipo;
list<textos>::iterator txt;
double tiempo;
CPoint zona1;
CPoint zona2;
UINT periodo;
}especial;


list<especial> lista;

lista.push_back(...);
lista.push_back(...);
lista.push_back(...);
lista.push_back(...);
lista.push_back(...);

Si yo ahora quiero que los elementos esten ordenados por la variable
tiempo, como lo puedo hacer?

He intendado hacer mi propia función, pero cuando tengo que comparar si
los indices se han cruzado, no se como saber si los iteradores se han
cruzado.

Alguna idea?

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral [MVP]
16/12/2004 - 17:55 | Informe spam
Dos opciones

1) Impementar el operador = para tu clase de manera que compares el valor
del campo que quieras ordenar, si esto no cocuerda con la semantica esperada
para el operador = utiliza la opcion 2. Tendrias que convertir el struct a
clase y no se si te interesa, sino opción 2

2) Implementar un comparador para pasar al metod sort:

struct espacialComparador
{
bool operator()(const especial& lhs, const especial& rhs)
{
return lhs.tiempo== rhs.tiempo;
}
}
#2 Rodrigo Corral [MVP]
16/12/2004 - 18:14 | Informe spam
Vaya perdona las equivocaciones, lo puesto antes es para el find, no para el
sort.

Opción 1
Implementa el operador <

Opción 2

struct espacialComparador
{
bool operator()(const especial& lhs, const especial& rhs)
{
return lhs.tiempo < rhs.tiempo;
}
}

"Rodrigo Corral [MVP]" escribió en el mensaje
news:%233Co%
Mostrar la cita
#3 Sergio
17/12/2004 - 09:53 | Informe spam
Rodrigo Corral [MVP] wrote:
Mostrar la cita
Gracias por las respuestas, pero no se muy bien como implementar la
segunda opción, ya que la estructura la uso en varios programas que
estan relacionados entre sí, y no quiero tener que hacer muchos cambios,
como pasar la estructura a clase, porque solo ordeno en uno de los
programas, en el resto solo leen la lista.
#4 Rodrigo Corral [MVP]
17/12/2004 - 10:34 | Informe spam
La segunda opción no consiste en hacer cambios a la estructura espacial,
solo tienes que añadir una nueva structutura que tal y como la que te pongo
en el mensaje que se pasa como parametro al metodo sort de la lista, de
maner que el metodo sort llama a la función operator() de la structura para
saber que objeto es "mayor" que otro.

No tienes que cambiar tu estructura, sino crear una nueva. La opción 1 es la
que implicaria cambiar tu estructura.

Este tipo de estructuras o clases que encapsulan una función son habitualues
en STL, se llaman functors.

Si tienes mas dudas no dudes en preguntar.


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
#5 Sergio
17/12/2004 - 11:10 | Informe spam
Rodrigo Corral [MVP] wrote:
Mostrar la cita
Muchas gracias por todo, ahora sí.
Ads by Google
Search Busqueda sugerida