2014-12-16 2 views
0

У меня есть эта структура:STL Карта со структурой

struct tuple{int node; float cost}; 
std::map<int,std::set<tuple>> graph; 

Я хотел бы знать, как изменить оператор сравнения для контейнера карты, так что я не вставить ключ многократного значения, как в примере:

Напр .:

insert(1, {2,3}) 
insert(1, {2,4}) // not allowed 
insert(1, {4,3}) // allowed 

контейнеры используются для реализации графика, таким образом, всякий раз, когда узел находится уже в другом узле примыкания, он больше не может быть вставлен в этом смежности. Спасибо.

+0

Можете ли вы объяснить на более высоком уровне, что вы пытаетесь сделать с этой структурой данных? –

+1

Ключ «1», и вы не можете его дважды! –

+1

Все три вставки, похоже, используют один и тот же ключ ... –

ответ

1

Вы не можете этого сделать. Ключ вашего map - int, нет способа посмотреть его на tuple.

Может быть, вы могли бы заменить карту с std::set<std::pair<int, std::set<tuple>>, Cmp> где Cmp является

struct Cmp 
{ 
    using value_type = std::pair<int, std::set<tuple>>; 
    bool operator()(const value_type& l, const value_type& r) const 
    { 
    if (l.first < r.first) 
     return true; 
    if (l.first > r.first) 
     return false; 
    return l.second < r.second; 
    } 
}; 

Это работает, потому что std::set может изучить любой ее части value_type определить порядок элементов, в то время как std::map может только изучить его key_type

Вам необходимо проверить определение сравнения, однако неясно, как вы ожидаете использовать std::set<tuple>, когда tuple не является LessThanComparable, и i t не понятно, что вы ожидаете insert(1, {3,4}) делать, когда {3,4} недействительный инициализатор для set<tuple>.

Смежные вопросы