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);
但由於鏈表的特點,能高效地進行插入和刪除。
