erase函式可以用於刪除vector容器中的乙個或者一段元素,在刪除乙個元素的時候,其引數為指向相應元素的迭代器,而在刪除一段元素的時候,引數為指向一段元素的開頭的迭代器以及指向結尾元素的下乙個元素的迭代器:
在進行單個元素刪除後,傳入的迭代器指向不變,仍然指向被刪除元素的位置,而被刪除元素之後的所有元素都向前移動一位,也就是該迭代器實際上是指向了原來被刪除元素的下乙個元素。
刪除一段元素後,傳入的迭代器指向也是不變的,仍然指向原來傳進去時候的位置,修改的是刪除段後面的元素的位置。
如下**測試其記憶體變化情況:
//測試對於vector中迭代器使用erase函式後,傳入的迭代器引數的變化情況。
#include
#include
using
namespace
std;
int main(void)
}for (itor = array.begin(); itor != array.end(); itor++)
cout
<< endl;
//刪除一段元素
vector
::const_iterator iter_begin = array.begin() + 1;
vector
::const_iterator iter_end = array.end() - 1;
array.erase(iter_begin, iter_end);
for (itor = array.begin(); itor != array.end(); itor++)
//刪除最後乙個元素
vector
::iterator iter_last = array.end() - 1;
array.erase(iter_last);
for (itor = array.begin(); itor != array.end(); itor++)
return
0;}
在刪除單個元素300之前記憶體中的值:
即容器中的元素為100、300、300、500、600
刪除300之前指向該元素的迭代器:
刪除300之後記憶體中的值的變化:
此時容器中的元素為:100、300、500、600
刪除300之後該迭代器情況:
由上面的對比可知,刪除單個元素前後,迭代器的指向都是不變的,而將該元素刪除之後,所刪除元素後邊的元素會全部向前複製乙個元素位置,指向容器尾部下一位的迭代器即array.end()也會相應前移一位,也就是結尾變成了紅色的600,而array.end()指向白色的600。
刪除一段元素:
刪除之前的記憶體情況是:
容器中的元素為:100、300、500、600
假設要刪除的是300和500;
那麼傳入的引數應該是指向300和600(500的下一位)的兩個迭代器;
執行刪除操作後,容器記憶體情況是:
刪除後容器中的元素為:100、600。
執行刪除操作後,作為引數的兩個迭代器的情況是:
由上面可以看到,刪除一段段元素之後,後面的元素(從iter_end開始到vector.end())會被複製到被刪除元素段開始的地方(iter_begin開始),而vector.end()也根據刪除的元素個數往前移動。上圖為移動到500處,即最後乙個元素600的下乙個位置。
總結:刪除操作傳入迭代器,而迭代器所指向的位置在刪除前後是不發生改變的,改變的只是容器中的元素值,刪除相應元素後,被刪元素後面的所有元素複製到被刪除元素的位置上去,同時指向容器尾部的迭代器也移動到新的尾部位置。
vector中erase()的使用
vector erase 從指定容器刪除指定位置的元素或某段範圍內的元素 vector erase 方法有兩種過載形式 如下 iterator erase iterator where iterator erase iterator first,iterator last 如果是刪除指定位置的元素時...
vector呼叫erase刪除元素
for std vector iterator iter g vecdownloadinfos.begin iter g vecdownloadinfos.end else pop back 只刪除最後乙個元素,而erase可以刪掉乙個由iterator指出的元素,也可刪掉乙個範圍的元素 remov...
在vector的迴圈中呼叫erase
在使用vector的過程中,有時會遇到需要迴圈遍歷vector,並刪除符合指定條件的元素。當 指定條件 不複雜時,應該盡量使用erase remove if begin,end,func end 的形式來完成功能。但有時候 指定條件 過於複雜,不得不顯式地寫乙個for迴圈來處理。我們必須小心在意er...