es necesario definir operador menor que para permitir comparaciones para su tipo de nodo:
struct Node
{
int a;
int b;
};
bool operator<(Node const& n1, Node const& n2)
{
// TODO: Specify condition as you need
return ... ;
}
Aquí se puede comprobar lo LessThan Comparable significa para un tipo definido por el usuario.
La solución alternativa es definir un functor basado en std::binary_function. Desde el punto de vista del diseño, esta opción tiene ventajas porque la comparación está efectivamente desacoplada de la clase Node
. Esto hace posible definir mapas especializados con diferentes condiciones de comparación (funtores).
#include <map>
struct Node
{
int a;
int b;
};
struct NodeLessThan
: public std::binary_function<Node, Node, bool>
{
bool operator() (Node const& n1, Node const& n2) const
{
// TODO: your condition
return n1.a < n2.a;
}
};
int main()
{
Node node;
node.a = 2;
node.b = 3;
typedef std::map<Node, int, NodeLessThan> node_map_t;
node_map_t bb;
bb[node] = 1;
}
Por lo tanto, se puede definir más comparaciones que sólo NodeLessThan
, por ejemplo usando diferentes condiciones o uno que comparaba únicamente por Node::a
otra comparación de ambos componentes, Node::a
y Node::b
. Entonces, se define diferentes tipos de mapas:
typedef std::map<Node, int, NodeLessThan> node_map_t;
typedef std::map<Node, int, NodeLessThanByA> node_map_a_t;
Tal desacoplamiento es menos intrusivo (no toca clase de nodo en absoluto) y es beneficioso para conseguir la disolución más extensible.
gracias a todos! No pensé que ese mapa requiera comparación. – sevity
@Steve Para ser aún más precisos, los indicadores PUEDEN no ser comparables con <- depende de lo que señalen. –
Sí, lo que quise decir es que "los punteros del mismo tipo no son en general comparables con' <'". Los punteros a diferentes partes del mismo objeto/matriz son comparables, y para el caso, todos los punteros pueden ser comparables si la implementación lo dice. –