为什么 C++ Map 说该结构存在而实际上不存在?

问题描述 投票:0回答:1

我有一个名为 foo 的结构体,还有一个名为 mp 的映射,但由于某种原因,当我插入 {5, 0, 3} 并查询 {5, 3, 0} 时,映射显示它包含 {5, 3, 0} 但实际上没有:

#include <bits/stdc++.h>

using namespace std;

struct foo {
    int v1, v2, v3;
    friend bool operator<(const foo &a, const foo &b) {
        return a.v1 < b.v1;
    }
    friend bool operator==(const foo &a, const foo &b) {
        return (a.v1 == b.v1) && (a.v2 == b.v2) && (a.v3 == b.v3);
    }
};

int main() {    
    map<foo, int> mp;
    mp[{5, 0, 3}] = 1;
    if(mp[{5, 3, 0}]) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }

    return 0;
}

输出:

YES

有谁知道为什么我的代码会这样做?如果是这样,我需要改变什么?

c++ hashmap
1个回答
0
投票

您的比较运算符与您的相等运算符不匹配。 A

std::map
不使用相等运算符;它使用“小于”。如果
a < b
b < a
都不是,则地图认为
a
b
等效。对于你的情况:

  • foo{5, 0, 3} < foo{5, 3, 0}
    false
    因为
    5 < 5
    是假的。
  • foo{5, 3, 0} < foo{5, 0, 3}
    false
    因为
    5 < 5
    是假的。

因此地图认为这些对象是等价的。所以

mp[{5, 3, 0}]
找到你刚刚设置为1的地图元素,因此它是一个真值。

为了获得您想要的结果,您的

operator<
需要考虑所有三个成员,而不仅仅是
v1

© www.soinside.com 2019 - 2024. All rights reserved.