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

C++ 容器 erase 迭代器失效與正確刪除元素

     編輯:關於C++

現象

vector::erase 會使被刪除元素及其後所有元素的迭代器失效,並回傳指向下一個元素的有效迭代器。若在迴圈中直接 erase 且不更新迭代器,會漏刪或存取失效迭代器。

錯誤範例

for (auto it = v.begin(); it != v.end(); ++it) {
    if (*it == 6) v.erase(it); // 錯誤:it 失效,++it 未定義行為
}

正確寫法

// 方法一:使用 erase 回傳值
for (auto it = v.begin(); it != v.end(); ) {
    if (*it == 6) it = v.erase(it);
    else ++it;
}

// 方法二:逆向迭代(不需回傳值)
for (auto it = v.rbegin(); it != v.rend(); ++it) {
    if (*it == 6) v.erase((it + 1).base()); // 較繁瑣
}

// 方法三:erase-remove 慣用語(刪除所有符合條件)
v.erase(remove(v.begin(), v.end(), 6), v.end());

程式碼驗證

/* test.cpp
 * Created on: 2014.04.18
 * Author: Spike
 */
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vi = {1, 6, 6, 3};
    for (auto it = vi.begin(); it != vi.end(); ) {
        if (*it == 6) it = vi.erase(it);
        else ++it;
    }
    cout << "size: " << vi.size() << endl;
    for (int x : vi) cout << x << ' ';
    cout << endl;
}

輸出

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