C++:查找并擦除设置元素
C++: Find and Erase a set element
我很难理解使用带有 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::set
说messi < xavi
和那个xavi < messi
.查找元素时,它找不到它,因为它假定它们已排序并使用二进制搜索查找它们。
相关文章:
- 在QComboBox或QListWidget中设置所选元素的样式文本?
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 无法在构造函数中执行设置元素插入
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 设置负元素特征稀疏向量C++
- 迭代时擦除设置元素///
- 为 unordered_map 中的元素设置默认构造函数(如果是 [] 运算符)
- 在C++中将指针数组的所有元素设置为 nullptr
- C++:如何将枚举元素设置为无限?
- 我们如何使用下面的集合构造函数构造设置元素
- 如何在遍历时添加要设置的元素?
- 如何通过STL设置迭代直到第二个元素
- 如何在类中初始化数组并为第一个元素设置值
- 如何将Bools中的一个元素设置为true
- 在编译时间检查模板参数类型是否设置或多键,并且容器的元素类型是算术的
- 如何将布尔矩阵的每个元素设置为false而不循环
- 如何在设置元素中重用向量?
- C++:查找并擦除设置元素
- 设置元素的get位置
- 从CHtmlView调用javascript或设置元素焦点