2010-01-27 9 views
0

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

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

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. Что мне делать? Большое спасибо.

+0

Какая у вас ошибка? – kennytm

ответ

1

Вам необходимо предоставить компаратор для prmEdge. Я предполагаю, что он использует компаратор по умолчанию для карты, например. сравнивая адрес ключа - это всегда одно и то же, потому что 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.

+0

Я думаю, чтобы решить мою проблему. Большое спасибо!!! – livio8495

1

Класс prmEdge должен определить функцию сравнения (по умолчанию operator<) для работы с std::map. Хотя вы не размещаете этот код, я бы ожидать, что будет ваша проблема (для записи, указатель имеет 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)); 
0

Элементы карты упорядочены по их ключам. Но карте должна знать, как :

либо перегружать < оператора в классе 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; 
Смежные вопросы