C++: найти и стереть заданный элемент

у меня возникли проблемы с пониманием использования поиска и стирания с набором 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);
        }
    }
}

У человека есть один атрибут (строковое имя) и метод 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;
}

Программа выдает исключение (NotMemberFound), когда я вызываю remove_member с последним добавленным элементом. Но если я попытаюсь стереть любого другого члена, у меня не будет этой проблемы.

Что не так с моим кодом?

// Извините за мой ужасный английский :S //


person user1760216    schedule 24.11.2012    source источник


Ответы (1)


Ваш компаратор должен быть

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

Компаратор должен сказать, уступает ли элемент другому. В вашем случае это как вы сказали std::set, что messi < xavi и что xavi < messi. При поиске элемента он не может его найти, поскольку предполагает, что они отсортированы, и ищет их с помощью двоичного поиска.

person alestanis    schedule 24.11.2012