首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ vector 元素刪除陷阱與正確姿勢

     編輯:C++ 入門

問題現象

遍歷 vector 並刪除特定值(如 1)時,直接 vals.erase(itr) 會導致迭代器失效,後續遍歷崩潰。

原因分析

erase() 會使被刪除元素及其後所有元素的迭代器失效。但它返回指向下一個元素的新迭代器,利用此返回值即可安全繼續遍歷。

錯誤代碼

while (itr != vals.end()) {
    if (1 == *itr) vals.erase(itr); // 迭代器失效!
    else ++itr;
}

正確寫法

while (itr != vals.end()) {
    if (1 == *itr) itr = vals.erase(itr); // 接收返回的迭代器
    else ++itr;
}

補充技巧

  • C++11 起可用 itr = vals.erase(itr) 統一風格。
  • 若需刪除多個符合條件元素,亦可用 remove_if + erase(Erase-Remove 慣用語):
    vals.erase(remove_if(vals.begin(), vals.end(), [](int x){ return x==1; }), vals.end());
  • 隨機訪問迭代器支持 ivec.erase(ivec.begin() + 3) 直接刪除指定位置。

總結

記住:erase 返回新迭代器,務必接收。這是 STL 容器修改時迭代器失效規則的典型體現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved