Вопрос
Я пытаюсь вставить некоторое значение пары в карту.Карта может состоять из объекта и вектора другого объекта.я не знаю почему, но единственный способ заставить код скомпилироваться - это объявить первый объект как указатель.Но таким образом, когда я вставляю какой-то объект, на карту помещается только первая пара.
Моя карта вот такая:
map<prmEdge,vector<prmNode> > archi;
это и есть код:
{
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;
}
}
Таким образом, у меня возникла ошибка при компиляции в классе pair.h.Что я мог поделать??Большое вам спасибо.
Решение
Вам необходимо предоставить компаратор для prmEdge.Я предполагаю, что он использует компаратор по умолчанию для map, напримерсравнивая адрес ключа, который всегда один и тот же, потому что e
является местным.
Объекты, которые служат ключами на карте, должны быть упорядочены, поэтому вам нужно либо предоставить оператор для сравнения ребер, либо функцию сравнения для карты.
class EdgeComparator {
public:
bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
// ... ?
}
};
map<prmEdge,vector<prmNode>, EdgeComparator > archi;
Действительно сложная часть - решить, как сравнить ребра, чтобы был определен окончательный порядок.Предполагая, что у вас есть только from
и to
Вы можете попробовать с:
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 );
}
};
Он будет отсортирован по первичному ключу from
и вторичный to
.
Другие советы
Класс prmEdge
необходимо определить функцию сравнения (по умолчанию operator<
) для работы с std::map
.Хотя вы не публикуете этот код, я бы ожидал, что это будет вашей проблемой (для справки, у pointer есть operator<
определенный.
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));
Элементы карты упорядочены по их ключам.Но карта должна знать, как это сделать:
Либо перегружать <
оператор в классе prmEdge...
class prmEdge
{
//...
public:
bool operator<(const prmEdge& right) const
{
//...
}
};
...или укажите компаратор для карты:
class Comparator
{
public:
bool operator()(const prmEdge& left, const prmEdge& right) const
{
// ...
}
};
map<prmEdge, vector<prmNode>, Comparator> archi;