【发布时间】:2010-12-10 19:55:56
【问题描述】:
在 std::set invalidate iterator 中进行擦除调用吗?正如我在最后一行的第 5 名以下所做的那样..? 如果是的话,从集合中删除所有元素的更好方法是什么
class classA
{
public:
classA(){};
~classA(){};
};
struct structB
{
};
typedef std::set <classA*, structB> SETTYPE;
typedef std::map <int, SETTYPE>MAPTYPE;
int __cdecl wmain (int argc, wchar_t* pArgs[])
{
MAPTYPE mapObj;
/*
...
.. Some Operation Here
...
*/
for (MAPTYPE::iterator itr1=mapObj.begin(); itr1!=mapObj.end(); itr1++)
{
SETTYPE li=(*itr1).second;
for (SETTYPE::iterator itr2=li.begin();itr2!=li.end();itr2++)
{
classA *lt=(classA*)(*itr2);
li.erase(itr2);
delete lt; // Does it invalidate Iterator ?
}
}
}
【问题讨论】:
-
typedef std::set
SETTYPE;我不确定您为什么将 StructB 作为第二个模板参数提供给 std::set。 std::set 只保存一个值(set 没有 key 和 map 一样),第二个模板参数用于为 set 提供比较函子(默认为 std::less)