ошибка сегмента / неопределенное поведение в функции сравнения std :: map - PullRequest
0 голосов
/ 09 января 2019

это меня смущает сегодня.

У меня проблемы с пониманием того, почему код ниже 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 Ответ

0 голосов
/ 09 января 2019

Ваша функция сравнения не работает. Вы, вероятно, имели в виду это:

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 являются истинными.

...