0

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

//Equality
bool isEqual(const A& a1, const A& a2 ) 
{
   return a1 == a2 ;
} 

但是,我有几个非常复杂的类要映射,并且我为这些类定义了 operator==,但没有定义 operator<。

谁能给我充分的理由不使用 operator== 进行地图比较?我想不出它会在我的课堂上崩溃的例子(如果需要,我可以添加我的课堂源代码)

我也应该咬住构建并编写新的操作符< :-/ 吗?

我会为我的地图做这样的事情。

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

也会

 ex1.find(A);

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

4

1 回答 1

3

因为std::map,std::set和它们的multi兄弟是按照 C++ 标准排序的结构,并且相等不能用于排序。另一方面,严格的弱排序用于确定相等性。

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

如果你只有相等比较,那么元素查找将不得不遍历结构,每次进行比较直到找到元素,导致线性时间复杂度。

如果你这样做了

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

then the map's comparison would not satisfy strict weak ordering, so neither the sorting of the map nor the element lookup would work. So iisn't just bad practice, it just doesn't work at all. You have to either implement operator< or provide a comparison functor, and which ever one you chose has to implement strict weak ordering. There is simply no way around that.

于 2012-06-21T08:36:25.997 回答