проблема с использованием структуры в качестве ключа std :: map - PullRequest
0 голосов
/ 26 марта 2020

мой код выглядит так:

struct Info
{
    string name;
    int score;
    bool operator< (const Info &x) const
    {
        return score < x.score;
    }
};
int main(int argc, char *argv[])
{
    Info a, b;
    a.name = "eric";
    a.score = 90;
    b.name = "cat";
    b.score = 85;

    map<Info, int> m;
    m[a] = 1;
    m[b] = 2;

    map<Info, int>::iterator it;
    for(it = m.begin(); it != m.end(); it++)
    {
        cout << it->first.name << endl;
    }

    return 0;
}

он выводит "cat" и "eri c", как и ожидалось. но как бы то ни было, когда я изменяю его на «сделать a.score и b.score одинаковыми» *

Info a, b;
a.name = "eric";
a.score = 90;
b.name = "cat";
b.score = 90;

Он выводит только "eri c", на всей карте есть только один элемент.

вопрос: считает ли std :: map один и тот же ключ? как заставить std :: map думать, что они не совпадают? Я пытался оператор ==, но не работает.

1 Ответ

1 голос
/ 26 марта 2020

Это один и тот же ключ, потому что ваш пользовательский компаратор использует счет в качестве ключа. Попробуйте вместо этого

bool operator< (const Info &x) const
{
    return name < x.name;
}

Если вы хотите, чтобы имя было ключевым, а карта сортировалась по счету, то, боюсь, вам не повезло, потому что карты отсортированы по ключу по определение. Вам придется выбрать другую структуру данных или другой алгоритм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...