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