【问题标题】:STL Map with structure带结构的 STL 映射
【发布时间】:2014-12-16 12:21:16
【问题描述】:

我有这个结构:

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”,不能有两次!
  • 所有三个插入似乎都使用相同的键...
  • 比较器只比较键(在您的情况下 - ints),而不是值,您不能使用在确定顺序时考虑值的比较器
  • 可能你需要一个向量<:set> 作为值,这样你就可以为同一个键保存多个集合。但请确保您不能再次插入相同的密钥。

标签: c++ stl


【解决方案1】:

你不能这样做。你map的key是int,没办法让它也看tuple

也许您可以用std::set&lt;std::pair&lt;int, std::set&lt;tuple&gt;&gt;, Cmp&gt; 替换地图,其中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

您需要检查比较的定义,当tuple 不是LessThanComparable 时,您还不清楚您希望如何使用std::set&lt;tuple&gt;,并且当{3,4} 时,您还不清楚您希望insert(1, {3,4}) 做什么不是set&lt;tuple&gt; 的有效初始化程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2012-02-06
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多