当前位置:首页 C++ > 正文

c++vector迭代器删除

作者:野牛程序员:2023-07-24 07:15:58 C++阅读 2925

在 C++ 中,使用 std::vector 的迭代器进行删除操作时,需要小心处理,因为一旦删除了元素,迭代器可能会失效。简单地使用 erase() 函数删除元素后,迭代器指向的位置可能不再有效,进而可能导致程序出现未定义的行为。

为了安全地删除 std::vector 中的元素,可以使用以下方法:

  1. 使用返回值处理法(Recommended):erase() 函数返回一个指向被删除元素的下一个元素的迭代器,可以利用这个返回值来更新迭代器。示例如下:

#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用迭代器遍历
    for (auto it = vec.begin(); it != vec.end();) {
        if (*it == 3) {
            it = vec.erase(it); // 删除元素,并将迭代器更新为下一个有效位置
        } else {
            ++it;
        }
    }

    // 输出结果:1 2 4 5
    for (const auto& num : vec) {
        std::cout << num << " ";
    }

    return 0;
}
  1. 使用逆向迭代器(Reverse Iterator): 可以使用 rbegin()rend() 函数得到逆向迭代器,从尾部开始遍历,并使用 base() 函数将逆向迭代器转换为普通迭代器,以进行删除操作。逆向迭代器的删除不会导致迭代器失效,因为删除的是当前元素的前一个元素。

#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用逆向迭代器遍历
    for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {
        if (*rit == 3) {
            auto it = rit.base(); // 将逆向迭代器转换为普通迭代器
            vec.erase(--it); // 删除元素
        }
    }

    // 输出结果:1 2 4 5
    for (const auto& num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

以上两种方法都能安全地删除 std::vector 中的元素,选择哪种方法取决于具体的情况和个人偏好。第一种方法更直观,而第二种方法则在删除操作较频繁时可能更高效。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击