首頁  >  文章  >  php教程  >  vector的erase操作

vector的erase操作

高洛峰
高洛峰原創
2016-11-22 15:24:081678瀏覽

    最近,在看書的時候,偶然間發現一個細節:就是vector的erase操作。對於這個erase操作,大家都清楚,這個刪除操作有2種形式,(1)刪除單一元素,參數是迭代器變數;(2)刪除區間元素,參數是begin和end。而細節就是在刪除單一元素的時候,發生的具體事情。

    例如:有一個vector,是這樣初始化的,vector va{0,1,2,2,3,4,5},刪除掉vector中 元素等於2的!

通常程式碼是這樣寫的:

#include <vector>
 #include <iostream>

int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     std::vector<int> vb(va);     for (auto i = va.begin();i != va.end(); i++)     {         if (*i == 4)         {             i = va.erase(i);         }     }     for (auto i : va) { std::cout << i << "  "; }     return 0; }

乍看之下並無不妥之處,然而結果卻出乎意料

vector的erase操作

為什麼結果會是這樣呢?仔細想想了,原來是在刪除的地方出了錯誤,當if條件成立之後,vector進行刪除操作,刪除掉vector中符合條件的元素,重點來了,當vecotr執行erase操作的之後,返回的值表示目前被刪除迭代器的下一個位置,注意,是下一個位置,然後,當再次循環的是,迭代器又向後移動了一個位置,導致接下來相同的元素並沒有被刪除。

附上正確寫法:

#include <vector> #include <iostream>

int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     std::vector<int> vb(va);     auto iter = vb.begin();     while(iter!=vb.end())     {         if (iter != vb.end())         {             if (*iter == 4)             {                 iter = vb.erase(iter);             }             else 
            { iter++; }         }     }     for (auto j : vb)     {         std::cout << j << "  ";     }     return 0; }
#include <vector>  #include <iostream>


int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     for (auto i = va.begin();i != va.end(); )     {         if (*i == 4)         {             i = va.erase(i);         }         else { i++; }     }     for (auto i : va)     {         std::cout << i << "  ";     }     return 0; }


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn