我的代码是这样的:
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 ==,但没有用。
它们是相同的键,因为您的自定义比较器使用分数作为键。试试这个代替
bool operator< (const Info &x) const
{
return name < x.name;
}
如果您想将名称作为键,但要根据分数对地图进行排序,那么恐怕您不走运,因为根据定义,按键对地图进行了排序。您必须选择其他数据结构或其他算法。