STL中erase() 使用區別

erase()函數的功能是用來刪除容器中的元素
容器按內存分配方式能夠分爲鏈表容器和數組容器。
所謂的鏈表容器指的是一種表現方式,包括list這樣基於節點的容器(動態分配內存塊)和set、map等關聯容器(平衡樹實現),而數組容器指的是在一塊連續的內存上保存元素的連續內存容器,好比vector、deque、string等。數組

一、鏈表容器以list爲例,當執行container.erase(it)時,確實第一個知足條件的元素刪除了,但這時it指針已經被刪除 了,它也不指向任何元素了,因此也只能到此爲止了,也就是說上面的代碼對於鏈表容器來講只能正確刪除第 一個知足條件的元素,針對這個問題咱們首先想到的就是在刪除指針以前,給其作個備份
將這個臨時變量直接創建在erase實現裏,這樣作更簡潔,也顯得專業些。
list<int>::iterator it; ide

for (it = lt.begin(); it != lt.end(); )
 {
     if ()
     {
         lt.erase(it++); //這裏是關鍵
     }
     else
     {
         ++it;
     }
 }

鏈表容器使用erase刪除節點還有一個特色,就是會將下一個元素的地址返回,因此也能夠這樣實現:
list<int>::iterator it;
for (it = lt.begin(); it != lt.end(); )
{
if()
{
it = lt.erase(it);//自動返回下一個元素的地址,不用再主動前移指針
}
else
{
++it;
}
}
二、數組容器以vector爲例,當執行container.erase(it)時,和上面提到的同樣,第一個知足條件的元素刪除了,但這 時數組容器不容許中間有「空隙」,因此會作個大動做,就是將被刪元素後面全部的元素前移(參考STL源碼), 而數 組容器記錄的是下標,因此刪除元素後,當前下標定位的元素也就瓜熟蒂落的變成了原有隊列中的下一個 元素,同 樣以刪除偶數爲例,代碼以下:
vector<int>::iterator it = v.begin();
for (it = v.begin(); it != v.end(); )
{
if ()
{
v.erase(it);//刪除元素後,後面元素自動往前移,不用挪動指
}
else
{
++it;
}
}函數

相關文章
相關標籤/搜索