Ошибка сегмента / неопределенное поведение в функции сравнения 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
1 ответ
Ваша функция сравнения не работает. Вы, вероятно, имели в виду это:
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<i2
а также i2<i3
это правда.