使用Equality进行地图比较

时间:2012-06-21 08:33:35

标签: c++ stl

我知道在排序地图时使用等式而不是等价是不好的做法。

//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);

现在使用平等而不是等价?

1 个答案:

答案 0 :(得分:3)

因为std::mapstd::set及其multi兄弟节点是按照C ++标准排序的结构,并且相等不能用于排序。另一方面,严格的弱排序可以用于确定相等。

至于为什么对结构进行排序,标准要求插入和查找具有对数复杂度,这可以通过使用二叉搜索树来实现。在这种结构中进行相等比较的唯一用途是测试元素的存在。

如果只进行相等比较,则元素查找必须遍历结构,每次进行比较直到找到元素,导致线性时间复杂度。

如果你这样做

std::map<A,B,isEqual> ex1;

然后地图的比较将不满足strict weak ordering,因此地图的排序和元素查找都不起作用。所以我只是不好的做法,它根本不起作用。您必须实现operator<或提供比较函子,并且您选择的任何一个都必须实现严格的弱序。没有办法解决这个问题。