C++ 利用迭代器刪除元素
阿新 • • 發佈:2020-12-19
利用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