剖析vector.erase()實現


先看以下代碼:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main(void)
 5 {
 6     vector<int>array = {100, 300, 300, 300, 300, 500};

13 for (size_t i = 0; i < array.size(); ++i) 14 { 15 cout << &array[i] << " -> " << array[i] << endl; 16 } 17 vector<int>::iterator itor; 18 for (itor = array.begin(); itor != array.end(); itor++) 19 { 20 if (*itor == 300) 21 { 22 itor = array.erase(itor); 23 } 24 } 25 for (size_t i = 0; i < array.size(); ++i) 26 { 27 cout << &array[i] << " -> " << array[i] << endl; 28 } 29 for (itor = array.begin(); itor != array.end(); itor++) 30 { 31 cout << *itor << ""; 32 } 33 return 0; 34 }

結果竟然如下:

我們將其刪除前后每個元素的地址打印出來,如下:

erase在刪除當前元素后,會將其后元素前移,以保證vector的連續存儲。

vs編譯器erase實現:

 1 iterator erase(const_iterator _Where)
 2 {    // erase element at where
 3     if (_VICONT(_Where) != this
 4         || _VIPTR(_Where) < this->_Myfirst
 5         || this->_Mylast <= _VIPTR(_Where))
 6         _DEBUG_ERROR("vector erase iterator outside range");
 7     _Move(_VIPTR(_Where) + 1, this->_Mylast, _VIPTR(_Where)); //移動
 8     _Destroy(this->_Mylast - 1, this->_Mylast);
 9     _Orphan_range(_VIPTR(_Where), this->_Mylast);
10     --this->_Mylast;
11     return (_Make_iter(_Where));
12 }

`stl_vector.h`實現:

1 iterator erase(iterator position) {
2     if (position + 1 != end())
3         copy(position + 1, finish, position); //copy至前面
4     --finish;
5     destroy(finish);
6     return position;
7 }

上面程序,在每次erase后,erase返回的迭代器就已經指向被刪除元素后一個元素,再++,就會跳過一個元素(300)。


免責聲明!

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



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