使用struct作为std :: map键的问题

问题描述 投票:0回答:1

我的代码是这样的:

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”和“ eric”。但是但是,当我将其修改为(使a.score和b.score相同)]

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

仅打印“ eric”,整个地图中只有一个元素。

问题:std :: map是否认为它们是相同的键?我如何使std :: map认为它们不是同一密钥?我尝试了operator ==,但没有用。

c++ data-structures stl std
1个回答
1
投票

它们是相同的键,因为您的自定义比较器使用分数作为键。试试这个代替

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

如果您想将名称作为键,但要根据分数对地图进行排序,那么恐怕您不走运,因为根据定义,按键对地图进行了排序。您必须选择其他数据结构或其他算法。

© www.soinside.com 2019 - 2024. All rights reserved.