如何解决std :: unordered_map-运算符!=和用户定义的值
这是示例代码:
struct T
{
int x;
int y;
bool operator !=(const T& t) const
{
return std::tie(x,y) != std::tie(t.x,t.y);
}
};
int main()
{
std::unordered_map<int,T> m1;
std::unordered_map<int,T> m2;
if (m1 != m2) //compilation error
{
}
}
对于无序映射,我需要使用operator!=
。代码未编译,因为未找到operator==
。我可以这样解决:
bool operator ==(const T& t) const
{
return std::tie(x,y) == std::tie(t.x,t.y);
}
然后以这种方式比较地图:
if(!(m1 == m2))
这是最佳解决方案还是也许有一种直接使用operator!=
的方法?
解决方法
比较std::unordered_map
的要求是密钥类型必须是EqualityComparable。这意味着T
必须能够计算表达式a == b
,其中a,b
都是T
类型。
如果您要做的只是比较这些映射的相等性,则应改为定义==
运算符。
如果您想同时拥有两个运算符,建议您像显示的那样用!=
来定义==
,但是也可以用其他方法来做。
请注意,在C ++ 20中,您只需要定义operator ==
,就会为您定义反operator !=
。
有关更多详细信息,请参见https://en.cppreference.com/w/cpp/container/unordered_map/operator_cmp和https://en.cppreference.com/w/cpp/named_req/EqualityComparable。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。