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;
}
}
Respuesta Responder a este mensaje
#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%
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;
}
}



Respuesta Responder a este mensaje
#3 Sergio
17/12/2004 - 09:53 | Informe spam
Rodrigo Corral [MVP] wrote:
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%

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;
}
}











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.
Respuesta Responder a este mensaje
#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
Respuesta Responder a este mensaje
#5 Sergio
17/12/2004 - 11:10 | Informe spam
Rodrigo Corral [MVP] wrote:
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.





Muchas gracias por todo, ahora sí.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida