我有这个结构:
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)
你不能这样做。 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>
能够执行此操作。