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

时间:2018-02-27 11:26:16

标签: c++ oop stl

我想使用map

创建一个简单的数据存储
map<int , Person> people;

Person是

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时遇到问题。可能我只是不知道正确的语法,我找不到答案。它可能应该看起来像那样,但 name Person 类的元素,所以我想它应该给我一个错误。

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

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

2 个答案:

答案 0 :(得分:0)

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

map<string, Person>

其中字符串是名称。

答案 1 :(得分:0)

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

在这种情况下,你可以这样做:

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对象的实例直接查询。