ordenar std::map on objeto funcion

Z

Hola, tengo este tipo

typedef std::map<Articulo*,LineaPedido,OrdenaArticulos> ItemsPedido;

donde Articulo es una clase definida por mi la cual tiene una referencia,que obtengo con el método Articulo::referencia();
LineaPedido es otra clase definida por mi.
Y OrdenaArticulos es una clase de objeto función que debería ordenar el map ascendentemente por la referencia del articulo y aquí esta el problema.Se que una clase de objeto función es una función que tiene el operador () sobrecargado,pero no se como va exactamente ni que tendría que hacer la clase OrdenaArticulos en este caso, a ver si alguien me orienta porque estoy perdido.

Czhincksx

A un paso de acabar la carrera y no he entendido ni pío :/

Para empezar hablamos de C++, ¿no? ¿Por qué tienes una clase llamada OrdenaArtículo cuando eso debería hacerse con un método? Además se supone que el map lo usas para asociar claves objeto-valor, ¿por qué pasarle la clase que quieres usar para reordenar el map al propio map?

Lo suyo sería que tuvieras alguna clase que trabajara con ItemsPedido definido más o menos así:

map<valor de la referencia del artículo, LineaPedido*> ItemsPedido;

Z

Si es c++,y bueno lo de como hacerlo no es cosa mia,esto es de la universidad,y OrdenaArticulos tiene que ser un objeto de clase funcion,que ordene el map

r2d2rigo

Mira la estructura classcomp en el ejemplo: http://www.cplusplus.com/reference/map/map/map/

Basicamente tienes que crearte una clase/estructura OrdenaArticulos que implemente operator() con el criterio de ordenacion, algo asi:

struct OrdenaArticulos
{
  bool operator() (const Articulo* left, const Articulo* right) const
  {
    return left->referencia() < right->referencia();
  }
};

PD: ni puta idea de a que te refieres con "clase de objeto función".

2 1 respuesta
JuAn4k4

Se refiere a que es una función pasada como parámetro, pero como no se debe poder hacer eso en C++, y dada la flexibilidad de este, se inventan una forma de poder pasar una función como parametro para aplicarla a un objeto (lista, etc..).

Yo diría que es eso.

2 respuestas
r2d2rigo

#5 entonces es un puntero a funcion de toda la vida, no entiendo por que enreversarlo de esa manera.

1 respuesta
Z

#5 A eso me refiero,eso es lo que tengo que hacer...pero no tengo mucha idea de como ordenar un map

1 respuesta
JuAn4k4

#6 Cierto, un puntero a función, pero no veo que pase ningún puntero.

2 respuestas
r2d2rigo

#7 te lo he puesto yo. Si tiene que ser obligatoriamente con un puntero a funcion y no con una clase que ordene, solo cambia un poco la sintaxis:

bool OrdenaArticulos (Articulo* left, Articulo* right)
{
  return left->referencia() < right->referencia();
}
Z

#8 Tengo que hacerlo con un objeto función,si o si

Gusete

#4 Segun el standard del 2011 (no he comprobado el del 2003 pero supongo que esto no habra cambiado) cualquier "cosa" que se comporte como una funcion es un objeto funcion (vamos, que tenga el operador()).

#8 en #4 te ha dado la solucion.

Draft del standard 2011:
"20.8 Function objects [function.objects]
1 A function object type is an object type (3.9) that can be the type of the postfix-expression in a function call
(5.2.2, 13.3.1.1).228 A function object is an object of a function object type. In the places where one would
expect to pass a pointer to a function to an algorithmic template (Clause 25), the interface is specified to
accept a function object. This not only makes algorithmic templates work with pointers to functions, but
also enables them to work with arbitrary function objects."

1 1 respuesta
r2d2rigo

#11 si quisiera usar C++ 11 me pasaria a un lenguaje con garbage collector de verdad como Java o C# :clint:

1 respuesta
Gusete

#12 en el standard del 2003 tambien esta definido el concepto de "objeto funcion". Aunque ligeramente diferente a efectos practicos es lo mismo que dije antes.

Aclarar que C++11 no implementa un "garbage collector" si no "reference counters" en los "smart pointers" (que vienen de boost).

Draft del standard 2003:
"20.3 Function objects [lib.function.objects]
1 Function objects are objects with an operator() defined. They are important for the effective use of the
library. In the places where one would expect to pass a pointer to a function to an algorithmic template
(clause 25), the interface is specified to accept an object with an operator() defined. This not only
makes algorithmic templates work with pointers to functions, but also enables them to work with arbitrary
function objects."

1

Usuarios habituales