迭代器有效性,在std :: set中的erase()调用之后 [英] iterator validity ,after erase() call in std::set
本文介绍了迭代器有效性,在std :: set中的erase()调用之后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在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;
/ *
...
..一些操作
...
* /
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; //它使迭代器无效吗?
}
}
}
解决方案>
因为你只是显然删除集合的每一个元素,你可以做:
for(SETTYPE :: iterator itr2 = li.begin(); itr2!= li.end(); itr2 ++)
{
classA * lt =(classA *)(* itr2);
delete lt;
}
li.clear(); //清除元素
Do erase call in std::set invalidate iterator ? As i have done below 5th from last line..? if yes what is better way to erase all elements from set
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 ?
}
}
}
解决方案
Since you are just apparently deleting every element of the set, you could just do:
for (SETTYPE::iterator itr2=li.begin();itr2!=li.end();itr2++)
{
classA *lt=(classA*)(*itr2);
delete lt;
}
li.clear(); // clear the elements
这篇关于迭代器有效性,在std :: set中的erase()调用之后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文