Pregunta

Estoy tratando de insertar algún valor de par en un mapa. El mapa de mayo está compuesto por un objeto y un vector de otro objeto. No sé por qué, pero la única forma de hacer el código para compilar es declarar el primer objeto como un puntero. Pero de esta manera, cuando inserto algún objeto, solo el primer par se coloca en el mapa.

Mi mapa es este:

map<prmEdge,vector<prmNode> > archi;

Este es el código:

{

bool prmPlanner::insert_edge(int from,int to,int h) {

prmEdge e; 
int f=from; 
int t=to; 
if(to<from){
    f=to;
    t=from; 
} 

e.setFrom(f);
e.setTo(t);

vector<prmNode> app;

prmNode par=nodes[e.getFrom()]; 
prmNode arr=nodes[e.getTo()];

app.push_back(par);
app.push_back(arr);

archi.insert(pair<prmEdge,vector<prmNode> >(e,app) );

return true;
 }

}

De esta manera, tengo un error en la compilación en el par de clases. ¿¿Qué puedo hacer?? Muchísimas gracias.

¿Fue útil?

Solución

Debe suministrar un comparador para PRMEDGE. Supongo que utiliza el comparador predeterminado para MAP, por ejemplo, comparando la dirección de la clave, que siempre es la misma porque e es local.

Se deben pedir objetos que sirven como claves en el mapa, por lo que debe suministrar un operador para comparar bordes o una función de comparación para el mapa.

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      // ... ?
   }
};

map<prmEdge,vector<prmNode>, EdgeComparator > archi;

La parte realmente difícil es decidir cómo comparar los bordes para que se define un orden definitivo. Asumiendo que solo tienes from y to Puedes probar con:

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      if ( emp1.from != emp2.from ) 
          return ( emp1.from < emp2.from );
      return ( emp1.to < emp2.to );
   }
};

Se ordenará en la clave primaria from y secundario to.

Otros consejos

La clase prmEdge necesita definir una función de comparación (el valor predeterminado es operator<) trabajar con std::map. Aunque no publicas ese código, esperaría que ese sea tu problema (para el registro, Pointer tiene un operator< definido.

struct A {
    int a;
    bool operator<(A other)
    {
        return a < other.a;
    }
};

struct B {
    int b;
};

bool cmp(B lhs, B rhs)
{
    return lhs.b < rhs.b;
}

std::map<A, int> map_a;
std::map<B, int, std::pointer_to_binary_function<B, B, bool> > map_b(std::ptr_fun(cmp));

Los elementos del mapa son ordenados por sus claves. Pero el mapa necesita saber cómo:

Ya sea sobrecargar el < Operador en la clase PRMEDGE ...

class prmEdge
{
    //...
    public:
        bool operator<(const prmEdge& right) const
        {
            //...
        }
};

... o especifique un comparador para el mapa:

class Comparator
{
    public:
        bool operator()(const prmEdge& left, const prmEdge& right) const 
        {
          // ...
        }
};

map<prmEdge, vector<prmNode>, Comparator> archi;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top