1. 程式人生 > 其它 >C++ 利用迭代器刪除元素

C++ 利用迭代器刪除元素

技術標籤:C++c++stl

利用C++迭代器刪除元素的錯誤寫法:

vector<int> a = { -5,-10,5,6,-3,4 };
void test(vector<int> &a)
{
	for (vector<int>::iterator it = a.begin(); it != a.end())
	{
		if (*it<0)
		{
			a.erase(it);
		}
	}
}

因為序列式容器(如vector,deque)使用的是連續分配的記憶體,刪除一個元素導致後面所有的元素會向前移動一個位置,刪除當前的iterator會使後面所有元素的iterator都失效。解決辦法:erase方法可以返回下一個有效的iterator。

對於list來說,它使用了不連續分配的記憶體,它的erase方法也會返回下一個有效的iterator。

vector<int> a = { -5,-10,5,6,-3,4 };
void test(vector<int> &a)
{
	vector<int>::iterator it;
	for (it = a.begin(); it != a.end();)
	{
		if (*it<0)
		{
			it = a.erase(it);	
		}
		else
		{
			++it;
		}
	}
}

對於關聯容器(如map,set,multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增當前的iterator即可。因為此類容器使用的是紅黑樹來實現,插入,刪除一個結點不會對其他結點造成影響。

set<int> a= { -5,-10,5,6,-3,4 };
void test(set<int> &a)
{
    set<int>::iterator it;  
    for (it= a.begin(); it!= a.end(); )  
    {  
         if (*it<0)  
              a.erase(it++);  
         else  
              ++it;  
    }
}

轉自:https://blog.csdn.net/yf_li123/article/details/75003425#comments