关联容器(STL)中的平等评估

Joh*_*0te 9 c++ stl

我知道STL关联容器(以及我猜的其他容器正在排序)使用排序标准来测试相等性.

容器的排序标准默认为st :: less,因此将对容器进行相等性测试:

if (! (lhs < rhs || rhs < lhs))
Run Code Online (Sandbox Code Playgroud)

或类似的东西.我对此有几个问题......

首先,它似乎是比较平等的一种奇怪的低效方式 - 为什么STL会这样做?我原本期望STL容器只是为了相等而采用额外的默认参数.

我的第二个问题更多是关于对上述if语句的评估.在C++中,将评估该语句的多少(lhs> rhs)是真的?它会在评估失败的一方后停止尝试,从而节省一些效率吗?如果是这样,首先评估表达式的哪一部分?

Gna*_*wme 18

在"有效STL"中,Scott Meyers在第19项中对此进行了广泛的讨论:

理解平等和等同之间的区别.

正如您所料,平等是基于operator==.

等价 "基于排序范围内对象值的相对排序...如果两个对象cc排序顺序中都不在另一个之前,则它们在容器中具有等价值."

迈耶斯用这种方式表达出来:

!( w1 < w2 ) // it's not true that w1 < w2
&&           // and
!( w2 < w1 ) // it's not true that w2 < w1
Run Code Online (Sandbox Code Playgroud)

迈耶斯随后重申:

这是有道理的:如果两个值都不在另一个之前(根据该标准),则两个值是等价的(相对于某些排序标准).

至于为什么STL这样做:

通过仅使用单个比较函数并使用等价作为"相同"的仲裁器,标准关联容器......避免了在标准关联中混合使用等同和等价的混淆容器.

阅读第19项(涵盖6页的较好部分),让自己获得完整的味道.

  • 他在谈论为什么使用`!(w1 <w2)&&!(w2 <w1)`来表示等价.他的"这是有道理的"陈述指的是那个. (2认同)

Fre*_*Foo 5

STL关联容器

您的意思是:标准C++排序的关联容器.

我原本期望STL容器只是为了相等而采用额外的默认参数.

会有什么成就?在你的教科书红黑树算法中,而不是

if (x < y)
    // ...
else if (y < x)
    // ...
else
    // equality
Run Code Online (Sandbox Code Playgroud)

你有

if (x == y)
    // equality
else if (x < y)
    // ...
else
    // y < x
Run Code Online (Sandbox Code Playgroud)

所以在最坏的情况下还是两个比较.

回应对这个答案的评论:只提供一个小于运算符使容器更容易使用,因为不需要保持小于和等于之间的一致性.让我们假设您有一个存储浮点数的程序.有一天,有人决定替换bitwise-equality float_equals函数,它恰好被一些容器使用,但也被它们的代码使用,通过近似的比较.如果那个人没有更新该float_less功能,因为他们的代码不使用该功能,那么你的容器代码会神秘地破坏.

(哦,在所示的示例代码中,一如既往地应用短路.)

  • 如果小于和等于运算符不同意100%,这可以消除可能出现的细微错误. (2认同)