迭代器有效性,在std :: set中的erase()调用之后 [英] iterator validity ,after erase() call in std::set

查看:178
本文介绍了迭代器有效性,在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆