Pergunta

Estou tentando inserir algum valor de par em um mapa. Maio mapa é composto por um objeto e um vetor de outro objeto. Não sei por que, mas a única maneira de fazer o código para compilar é declarar o primeiro objeto como um ponteiro. Mas dessa maneira, quando insiro algum objeto, apenas o primeiro par é colocado no mapa.

Meu mapa é o seguinte:

map<prmEdge,vector<prmNode> > archi;

Este é o 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;
 }

}

Dessa forma, tenho um erro na compilação no par de classe. O que eu poderia fazer?? Muito obrigado.

Foi útil?

Solução

Você precisa fornecer um comparador para o PRMEDGE. Meu palpite é que ele usa o comparador padrão para o mapa, por exemplo, comparando o endereço da chave - que é sempre o mesmo porque e é local.

Objetos que servem como chaves no mapa precisam ser solicitados, para que você precise fornecer um operador para comparar as bordas ou uma função comparadora para o mapa.

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

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

A parte realmente difícil é decidir como comparar as bordas para que uma ordem definitiva seja definida. Assumindo que você só tem from e to Você pode tentar com:

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

Vai classificar na chave primária from e secundário to.

Outras dicas

A classe prmEdge precisa definir uma função de comparação (o padrão é operator<) trabalhar com std::map. Embora você não publique esse código, eu esperaria que esse seja o seu problema (para o registro, o ponteiro tem um operator< definiram.

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

Os elementos do mapa são ordenados por suas chaves. Mas o mapa precisa saber como:

Sobrecarregar o < Operador na classe PRMEDGE ...

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

... ou especifique um comparador para o mapa:

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

map<prmEdge, vector<prmNode>, Comparator> archi;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top