我有以下程序用于自定义键的地图:
class MyClass
{
public:
MyClass(int i): val(i) {}
bool operator< (const MyClass& that) const { return val <= that.val; }
private:
int val;
};
int main()
{
MyClass c1(1);
MyClass c2(2);
MyClass c3(3);
map<MyClass, int> table;
table[c1] = 12;
table[c2] = 22;
table[c3] = 33;
cout << "Mapped values are: " << table.lower_bound(c1)->second << " " << table[c2] << " " << table[c3] << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
Mapped values are: 22 0 0
Run Code Online (Sandbox Code Playgroud)
但是,如果我在运算符<而不是<=中使用<或>进行比较,那么一切正常.输出如下:
Mapped values are: 12 22 33
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么<=根本不起作用,但<甚至>有效吗?
使用的比较函数std::map必须实现严格的弱排序.这意味着它必须实现给定对象下面的规则x,y以及z:
op(x, x) 必须永远是假的op(x, y)是真的那么op(y, x)必须是假的op(x, y) && op(y, z)是真的那么op(x, z)也必须是真的!op(x, y) && !op(y, x)是真的那么!op(x, z) && !op(z, x)也必须是真的该<=运营商不满足这些条件,因为鉴于x = y = 1,x <= x是不是假的,并都x <= y和y <= x是真实的.
std::map使用这些规则来实现其比较.例如,它可以实现等式检查!(op(x, y) || op(y, x)).鉴于x = 4,y = 4和op = operator<=这成为!(4 <= 4 || 4 <= 4),所以4不比较等于4,因为第一条规则之上被打破.
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |