zoukankan      html  css  js  c++  java
  • STL使用迭代器逆向删除

    网上有很多这种例子:

    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;
        }
    }
    

      

  • 相关阅读:
    [NOI2010]航空管制
    [POI2008]POD-Subdivision of Kingdom
    CF17C Balance
    [HAOI2007]理想的正方形
    [Code+#1]大吉大利,晚上吃鸡!
    HDU 3371
    hdu1102
    最短路算法、应用、模板总结
    csu十月月赛 并查集+分组背包
    csu 十月月赛 最短路+最小费用
  • 原文地址:https://www.cnblogs.com/flysnail/p/4413976.html
Copyright © 2011-2022 走看看