如何在map::find()函数中引用类元素?



我想使用map创建一个简单的数据存储,

map<int , Person> people;

其中 人 是

class Person
{
string name;
int age;
public:
Person() : name("noname"), age(0) {}
Person(string name, int age) : name(name), age(age) {}
void print()
{
cout << "| " << name << " | " << age << endl;
}
};

我在 map::find() 函数中引用 people.name 时遇到问题。可能我只是不知道正确的语法,我找不到答案。它可能应该看起来像那样,但名称Person类的元素,所以我想它应该给我一个错误。

if (people.find(name) != people.end())
{
people.erase(name);
cout << name << " removed from data base" << endl;
}
else
{
cout << name << " not found" << endl;
}

很抱歉我的无知,但我最近才开始编程,这就是为什么我不知道基本语法并且有时会感到困惑。

您的问题是您错误地设计了地图。如果你想用名字来查找一个人,那么这个名字必须是地图的键,即

map<string, Person>

其中字符串是名称。

如果你想有一个带有相应对象的name字典,你是否需要一个std::map<string, Person>

在这种情况下,您可以执行以下操作:

auto person = nameToPersonDictionary.find(personName); 
if (person != nameToPersonDictionary.end()){
nameToPersonDictionary.erase(personName);
// person is a reference to object Person 
}else{ // Not found
}

如果你只想建立一个查找表,你可以考虑std::set。另一个用例,如果name是对象的不可变属性Person(即name永远不会为人修改),set更适合。

您必须提供运算符<重载才能使设置正常工作。

提供重载的简单示例是:

// This assumes that there are can't be two distinct person with same name
bool operator<(const Person &left, const Person &right){
return left.name < right.name;  
}

然后,您可以使用Person对象的实例直接查询。

最新更新