STL容器迭代過程中刪除元素


1.連續內存序列容器(vector,string,deque)

序列容器的erase方法返回值是指向緊接在被刪除元素之后的元素的有效迭代器,可以根據這個返回值來安全刪除元素。

vector<int> c;
for(vector<int>::iterator it = c.begin(); it != c.end();)
{
if(*it)
  it = c.erase(it);
 else
  ++it; 
}

 

2.關聯容器(set,multiset,map,multimap)

關聯容器的erase方法沒有返回值,被刪除的迭代器失效,所以刪除前必須確保能得到下一個迭代器,可以用“后置遞增迭代器”技術。

map<int,int> m;
for(map<int,int>::iterator it = m.begin(); it != m.end();)
{
 if(條件) 
  m.erase(it++);
 else
  ++it;
}

m.erase得到it的一個副本,在erase真正開始之前it已經遞增了。

所以erase得到了當前的迭代器,在erase內部工作開始之前it已經++了,正好滿足我們的需要。

 

3.非連續內存序列容器(list)

只所以單獨列出來是因為以上兩種方法對list都適用,可依自己喜好選擇。

 

1.vector數據結構
vector和數組類似,擁有一段連續的內存空間,並且起始地址不變。
因此能高效的進行隨機存取,時間復雜度為o(1);
但因為內存空間是連續的,所以在進行插入和刪除操作時,會造成內存塊的拷貝,時間復雜度為o(n)。
另外,當數組中內存空間不夠時,會重新申請一塊內存空間並進行內存拷貝。

2.list數據結構
list是由雙向鏈表實現的,因此內存空間是不連續的。
只能通過指針訪問數據,所以list的隨機存取非常沒有效率,時間復雜度為o(n);
但由於鏈表的特點,能高效地進行插入和刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM