C++:调用Erase后删除的元素仍在集合中

C++:调用Erase后删除的元素仍在集合中,c++,set,erase,C++,Set,Erase,我得到了这样一个代码: for (set<GROUP*>::iterator i = Data.m_Resulting.begin(); i != Data.m_Resulting.end();) { printf("Deleting %d\n", (*i)->nId); Data.m_MpptPool.erase(i++); } printf("Remains in pool: %d\n", Data.m_MpptPool.size()); // Dump

我得到了这样一个代码:

for (set<GROUP*>::iterator i = Data.m_Resulting.begin(); i != Data.m_Resulting.end();)
{
    printf("Deleting %d\n", (*i)->nId);
    Data.m_MpptPool.erase(i++);
}

printf("Remains in pool: %d\n", Data.m_MpptPool.size());

// Dump Pool:

for (set<GROUP*>::iterator i = Data.m_MpptPool.begin(); i != Data.m_MpptPool.end(); i++)
{
    printf("\t %d\n", (*i)->nId);
}
如果在删除之前集合中有2个对象,并且firs循环删除其中一个对象,则.size函数将显示正确的数字1 但是,打印集合内容的第二个for循环显示了其中的两个元素。稍后,引用此元素会导致分段错误。
这里会出现什么问题?

不能使用来自一个std::set m_的迭代器,从而导致另一个std::set m_MpptPool。这是未定义的行为,您需要使用以下值:

Data.m_MpptPool.erase(*it++);

第一个循环迭代Data.m_,但删除Data.m_MpptPool中的元素。它使用指向前者的迭代器来删除后者中的元素。这是非法的,坦白说,毫无意义。代码的行为未定义。你希望它怎么工作?你这是什么意思

Data.m_MpptPool.erase(i++);

当迭代器我实际指向Data.m_Resulting时?

您是第一个循环,在m_Resulting上进行迭代,您的打印在m_MpptPool上完成。谢谢。我真不敢相信我自己没有弄明白