C++:查找并擦除设置元素

C++: Find and Erase a set element

本文关键字:设置 元素 擦除 查找 C++      更新时间:2023-10-16

我很难理解使用带有 STL 设置的查找和擦除。我有这个:

struct NotMemberFound : exception {};
class FriendGroup
{
private:
    set<Person, ClassComp> members;
public:
    FriendGroup(): {}
    virtual void add_member(const Person& person)
    {
        members.insert(person);
        n_members = members.size();
    }
    virtual void remove_member(const Person& person)
    {
        const set<Person, ClassComp>::iterator it = members.find(person);
        if (it == members.end())
            throw NotMemberFound();
        else
        {
            members.erase(it);
        }
    }
}

人员有一个属性(字符串名称)和返回他唯一属性的 metod get_name()。ClassComp 的定义是这样的:

struct ClassComp
{
    bool operator() (const Person& a, const Person& b) const
    {
        return a.get_name() != b.get_name();
    }
};

好吧,当我尝试像这样使用它时:

int main(void)
{
    Person messi("Messi");
    Person xavi("Xavi");
    Person iniesta("Iniesta");
    FriendGroup barcelona;
    barcelona.add_member(messi);
    barcelona.add_member(xavi);
    barcelona.add_member(iniesta);
    barcelona.remove_member(iniesta);
    return 0;
}

当我调用添加了最后一个元素的remove_member时,程序会抛出异常(NotMemberFound)。但是,如果我尝试删除任何其他成员,我没有这个问题。

我的代码有什么问题?

对不起我糟糕的英语:S//

您的比较器应该是

struct ClassComp {
    bool operator() (const Person& a, const Person& b) const {
        return a.get_name() < b.get_name();
    }
};

比较者应该说明一个元素是否不如另一个元素。在你的情况下,就像你对std::setmessi < xavi和那个xavi < messi.查找元素时,它找不到它,因为它假定它们已排序并使用二进制搜索查找它们。