码迷,mamicode.com
首页 > 其他好文 > 详细

STL使用迭代器逆向删除

时间:2015-04-10 13:00:16      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

网上有很多这种例子:

void erase(vector<int> &v)
{
	for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
	{
		if(*ri % 2 == 0)
		{
			cout << "Erasing " << *ri << endl;
			v.erase((++ri).base()); 
			//用base()函数将逆向iterator转换为正向的
		}
		else
		{
			++ri;
		}
	}
}

  但这样再我自己的编译环境中始终异常中断,提示vector iterators incompatible,这种错误的原因就是迭代器与容器不兼容或者失效。

      分析一下,erase函数执行完成后返回下个元素的指针,只要将这个指针转换成反向迭代器即可,一试果然如此。

void erase(vector<int> &v)
{
	for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
	{
		if(*ri % 2 == 0)
		{
			cout << "Erasing " << *ri << endl;
			ri = vector<int>::reverse_iterator(v.erase((++ri).base()));    //删除完要重置迭代器
		}
		else
		{
			++ri;
		}
	}
}

另附正向删除:

 

for (VectorType::iterator it = someVector.begin();; it != someVector.end();)
{

    if (*it== value)
    {
        it = someVector.erase(it);
    }
    else
    {
        ++it;
    }
}

  

STL使用迭代器逆向删除

标签:

原文地址:http://www.cnblogs.com/flysnail/p/4413976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!