【问题标题】:Order of operands in compare with std::map与 std::map 比较的操作数顺序
【发布时间】:2016-08-02 10:58:20
【问题描述】:
说我有:
bool operator<(Type const& lhs, Type const& rhs) { /* ... */ }
std::map<Type, void*> m;
如果我现在这样做
Type t{};
m.find(t);
t 是否总是会出现在 operator< 的左侧参数中,而 m 的元素会在右侧参数中与它进行比较(反之亦然)?
或者这个实现是否依赖于任何一种方式?
【问题讨论】:
标签:
c++
language-lawyer
stdmap
【解决方案1】:
如果我没记错的话,可以证明在某些情况下必须对双方进行评估。这是因为数学等式
a = b
(字典必须最终决定)是通过
模拟的
不是 (a 。
【解决方案2】:
这两种方式都没有明确的保证,实际上您可以期望在比较的任一侧找到您的操作数,因为操作最终需要观察¬(A<B) && ¬(B<A) 以确定A 和B 之间的相等性。
让你的操作符尽可能抽象,这样它就无关紧要了。让它只考虑它接收到的两个参数的值,而不知道任何容器或查找操作。