C ++:查找并擦除set元素

时间:2012-11-24 19:38:24

标签: c++ stl find set erase

我无法理解使用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);
        }
    }
}

Person有一个属性(String Name)和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 //

1 个答案:

答案 0 :(得分:5)

你的比较器应该是

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

比较者应该说一个元素是否低于另一个元素。在您的情况下,就像您对std::set messi < xavixavi < messi所说的那样。在查找元素时,它无法找到它,因为它假设它们已经排序并且使用二分查找来查找它们。