stl — 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);
}
}
}

Person имеет один атрибут (String Name) и метод 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 //

2

Решение

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

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]