我知道在排序地图时使用等式而不是等价是不好的做法。
//Equality
bool isEqual(const A& a1, const A& a2 )
{
return a1 == a2 ;
}
但是我想要映射一些非常复杂的类,我已经为这些类定义了operator ==,但是没有为operator&lt ;.
有人能给我很好的理由不使用operator ==进行地图比较吗?我想不出一个例子,它会在我的课程中崩溃(如果需要,我可以添加我的类源代码)
我也应该咬一下构建并编写新的运算符< : - /?
我会为我的地图做这样的事情。
std::map<A,B,isEqual> ex1;
也会
ex1.find(A);
现在使用平等而不是等价?
答案 0 :(得分:3)
因为std::map
,std::set
及其multi
兄弟节点是按照C ++标准排序的结构,并且相等不能用于排序。另一方面,严格的弱排序可以用于确定相等。
至于为什么对结构进行排序,标准要求插入和查找具有对数复杂度,这可以通过使用二叉搜索树来实现。在这种结构中进行相等比较的唯一用途是测试元素的存在。
如果只进行相等比较,则元素查找必须遍历结构,每次进行比较直到找到元素,导致线性时间复杂度。
如果你这样做
std::map<A,B,isEqual> ex1;
然后地图的比较将不满足strict weak ordering,因此地图的排序和元素查找都不起作用。所以我只是不好的做法,它根本不起作用。您必须实现operator<
或提供比较函子,并且您选择的任何一个都必须实现严格的弱序。没有办法解决这个问题。