带结构的STL地图

时间:2014-12-16 12:21:17

标签: c++ 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

容器用于实现图形,因此每当节点已经处于另一个节点邻接中时,它就不能再插入该邻接中。 感谢。

1 个答案:

答案 0 :(得分: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>不是LessThanComparable时,你不清楚预期如何使用tuple,并且不清楚是什么当insert(1, {3,4})不是{3,4}的有效初始化程序时,您希望set<tuple>能够执行此操作。