Вопрос

Я пытаюсь вставить некоторое значение пары в карту.Карта может состоять из объекта и вектора другого объекта.я не знаю почему, но единственный способ заставить код скомпилироваться - это объявить первый объект как указатель.Но таким образом, когда я вставляю какой-то объект, на карту помещается только первая пара.

Моя карта вот такая:

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top