今天这让我感到困惑。
我很难理解为什么以下代码在最终插入到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
答案 0 :(得分:4)
您的比较功能已损坏。您可能是这个意思:
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
的比较函数必须定义要插入或比较的对象的strict weak ordering,而您的函数则不需要,因为i3<i2
和i2<i3
都为true