std::map 的比较器函数中的 SEG 故障/未定义行为



这让我今天感到困惑。

我很难理解为什么下面的代码在最终插入test_map时出错。 使用 emplace(),insert() 都按预期工作,但使用 [] 运算符失败。 我已经阅读了 [] 的相关C++文档,但下面观察到的行为似乎与我所阅读的内容不匹配。

我已经逐步完成了 GDB 并注意到它在尝试比较器函数内的字符串时失败了。

#include <iostream>
#include <map>
#include <iostream>
class Testkey {
public:
    std::string s1;
    int64_t id;
    Testkey(const char* s1_, int64_t id_): s1(s1_), id(id_) {}
    bool operator<(const Testkey& rhs) const {
        if (s1 < rhs.s1)
            return true;
        if (id < rhs.id)
            return true;
        return false;
    }
};
int main() {
    Testkey i1("69739", 748072524);
    Testkey i2("69728", 52608624);
    Testkey i3("69725", 750212380);
    Testkey i4("68988", 55027788);
    std::map<Testkey, int> test_map;
    test_map[i1] = 1;
    test_map[i2] = 2;
    test_map[i3] = 3;
    std::cout << "hmm.." << std::endl;
    test_map[i4] = 4; // seg faults here in comparator function...
    std::cout << "done" << std::endl;
    return 0;
}

我在这里附上了一个回复https://repl.it/repls/RundownSparklingComment

您的比较函数已损坏。你可能的意思是:

bool operator<(const Testkey& rhs) const {
    if (s1 < rhs.s1)
        return true;
    if (s1 > rhs.s1)
        return false;
    if (id < rhs.id)
        return true;
    return false;
}

用于std::map的比较函数必须定义要插入或比较的对象的严格弱排序,而您的函数不会,因为i3<i2i2<i3都为真。

相关内容

  • 没有找到相关文章

最新更新