【问题标题】:C++: Find and Erase a set elementC++:查找和擦除集合元素
【发布时间】:2012-11-24 19:38:23
【问题描述】:

我无法理解使用带有 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 有一个属性(字符串名称)和返回他唯一属性的方法 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 //

【问题讨论】:

    标签: c++ stl find set erase


    【解决方案1】:

    你的比较器应该是

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

    比较器应该判断一个元素是否不如另一个。就你而言,就像你对std::setmessi &lt; xavixavi &lt; messi 一样。在查找元素时,它找不到它,因为它假定它们已排序并使用二进制搜索来查找它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2010-09-22
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      相关资源
      最近更新 更多