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

C++ vector中erase和insert引起迭代器失效

作者:野牛程序员:2023-07-31 21:57:41 C++阅读 2353

在 C++ 的 vector 容器中,使用 eraseinsert 成员函数都有可能引起迭代器的失效。这是因为这两个操作会改变容器的大小和内部结构,导致原先有效的迭代器不再指向有效的元素或被迭代器的指向无效的位置。

  1. erase 引起迭代器失效:

使用 erase 函数从 vector 中删除元素时,被删除元素之后的所有元素会向前移动,这可能导致原先的迭代器失效。删除元素后,原先的迭代器可能会指向无效的位置或者指向一个不正确的元素。

示例:

#include <iostream>
#include <vector>

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

    auto it = numbers.begin() + 2; // 指向第3个元素(值为3)的迭代器
    numbers.erase(it); // 删除第3个元素(值为3)

    // 此时迭代器已经失效,不能再使用
    std::cout << *it << std::endl; // 此处访问已失效的迭代器将导致未定义的行为

    return 0;
}
  1. insert 引起迭代器失效:

使用 insert 函数在 vector 中插入元素时,如果插入点之前有元素被添加进来,整个 vector 的存储位置可能会改变,导致原先的迭代器失效。

示例:

#include <iostream>
#include <vector>

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

    auto it = numbers.begin() + 2; // 指向第3个元素(值为3)的迭代器
    numbers.insert(it, 10); // 在第3个元素(值为3)前插入元素10

    // 此时迭代器已经失效,不能再使用
    std::cout << *it << std::endl; // 此处访问已失效的迭代器将导致未定义的行为

    return 0;
}

为了避免迭代器失效的问题,可以在进行 eraseinsert 操作后,使用返回值来更新迭代器,确保迭代器仍然指向有效的元素。

示例:

#include <iostream>
#include <vector>

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

    auto it = numbers.begin() + 2; // 指向第3个元素(值为3)的迭代器
    it = numbers.erase(it); // 删除第3个元素(值为3),并更新迭代器

    // 此时迭代器仍然有效
    std::cout << *it << std::endl; // Output: 4 (现在 it 指向值为4的元素)

    return 0;
}

总结起来,对于 vectoreraseinsert 操作,使用返回值来更新迭代器可以避免迭代器失效的问题,确保迭代器继续指向有效的元素。


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

最新推荐

热门点击