1. 程式人生 > >vector的erase()函式分析

vector的erase()函式分析

erase函式可以用於刪除vector容器中的一個或者一段元素,在刪除一個元素的時候,其引數為指向相應元素的迭代器,而在刪除一段元素的時候,引數為指向一段元素的開頭的迭代器以及指向結尾元素的下一個元素的迭代器:
在進行單個元素刪除後,傳入的迭代器指向不變,仍然指向被刪除元素的位置,而被刪除元素之後的所有元素都向前移動一位,也就是該迭代器實際上是指向了原來被刪除元素的下一個元素。
刪除一段元素後,傳入的迭代器指向也是不變的,仍然指向原來傳進去時候的位置,修改的是刪除段後面的元素的位置。
如下程式碼測試其記憶體變化情況:

//測試對於vector中迭代器使用erase函式後,傳入的迭代器引數的變化情況。
#include<iostream> #include<vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(500); array.push_back(600); vector<int>::iterator itor; //刪除單個元素 for (itor = array
.begin(); itor != array.end(); itor++) { if (*itor == 300) { itor = array.erase(itor); } } for (itor = array.begin(); itor != array.end(); itor++) { cout << *itor << " "; } cout << endl; //刪除一段元素 vector<int>
::const_iterator iter_begin = array.begin() + 1; vector<int>::const_iterator iter_end = array.end() - 1; array.erase(iter_begin, iter_end); for (itor = array.begin(); itor != array.end(); itor++) { cout << *itor << " "; } //刪除最後一個元素 vector<int>::iterator iter_last = array.end() - 1; array.erase(iter_last); for (itor = array.begin(); itor != array.end(); itor++) { cout << *itor << " "; } return 0; }

在刪除單個元素300之前記憶體中的值:
即容器中的元素為100、300、300、500、600
刪除單個元素之前記憶體中的值
刪除300之前指向該元素的迭代器:
刪除300之前指向該元素的迭代器
刪除300之後記憶體中的值的變化:
此時容器中的元素為:100、300、500、600
這裡寫圖片描述
刪除300之後該迭代器情況:
刪除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的下一個位置。

總結:刪除操作傳入迭代器,而迭代器所指向的位置在刪除前後是不發生改變的,改變的只是容器中的元素值,刪除相應元素後,被刪元素後面的所有元素複製到被刪除元素的位置上去,同時指向容器尾部的迭代器也移動到新的尾部位置。