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函數執行完成後返回下個元素的指針,只要將這個指針轉換成反向迭代器便可,一試果真如此。blog

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

另附正向刪除:it

 

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

    if (*it== value)
    {
        it = someVector.erase(it);
    }
    else
    {
        ++it;
    }
}
相關文章
相關標籤/搜索