`

C++容器删除数据时迭代器失效

 
阅读更多

我们在做c++容器的元素删除时,需要使用迭代器,并且调用erase方法时,必须传入迭代器的指针位置,

所以在删除操作进行判断满足条件删除时,将变得较为麻烦。

项目中通用解决思路一:

遍历vector向量,记录满足条件的迭代指针的位置,看做成索引计数存入vector<int>中,并且这个顺序一定是由前向后的,而如果我们按照如下规定删除,会有异常,

vector<int> index;

vector<XXX> vt;

vector<XXX>::iterator it = vt.begin();

for(int i=0; i<index.size(); i++) {

  vt.erase(it + index[i]);

}

因为这样做后,删除一个元素后会打乱这个元素后的所有待删除元素的索引,故考虑由后向前遍历index。

for(int i=index.size()-1; i>=0; i--) {

  vt.erase(it + index[i]);

}

这样,就避免了删除元素后打乱其后方待删除元素的索引。

 

在网上还有一种通用的做法是,记录erase返回的迭代指针值。

for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
{
  if(* it == 8)
  {
     it = arr.erase(it); //不能写成arr.erase(it);
  }
  else
  {
     ++it;
  }
}

 

不能写为如下:

for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++)
{
    if(* it == 8)
    {
        arr.erase(it); //在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。

     }
}

 

分享到:
评论

相关推荐

    c++迭代器失效问题

    然而,迭代器并不是无条件安全的,某些操作会导致迭代器失效,这可能是程序运行时出现未定义行为的根源。以下是对C++中迭代器失效问题的详细分析: 1. **插入和删除操作**:在容器中进行插入或删除元素时,迭代器...

    关于迭代器失效的一些认识

    2. **元素顺序的变化**:当执行删除操作时,容器内的元素顺序可能发生改变,这会导致指向被删除元素及其后继元素的迭代器失效。值得注意的是,这种失效仅限于指向特定位置的迭代器,而并非所有迭代器都会受到影响。 ...

    [C++][经验总结]vectory迭代器(iterator)失效

    2. **删除元素**:删除`vector`中的元素,尤其是通过迭代器来删除,会使迭代器失效。删除后,原来迭代器所指向的位置会被后面的元素填充,或者在末尾删除时,整个迭代器序列都会向前移动。 3. **扩容**:当`vector`...

    浅谈c++ stl迭代器失效的问题

    本文将深入探讨STL迭代器失效的问题,特别是在执行插入(insert)和删除(erase)操作时。 首先,让我们来看一下在删除元素时迭代器失效的情况。迭代器失效是指在执行某些操作后,原本有效的迭代器变得不可用,通常...

    c++迭代器失效的情况汇总

    C++迭代器失效是指在使用容器时,迭代器失去了指向正确元素的能力,而导致程序出错或崩溃。这种情况在C++编程中非常常见,尤其是在使用STL容器时。了解迭代器失效的情况可以帮助我们更好地编写C++程序,避免一些常见...

    vector的earse造成迭代器失效的问题

    在连续内存容器如`std::vector`中,插入和删除操作通常会导致迭代器失效。对于`std::vector`中的迭代器而言,以下是一些可能导致迭代器失效的情况: 1. **当向容器尾部插入元素** (`push_back`) 后: - 如果`push_...

    基于list循环删除元素,迭代器失效的问题详解

    在编程中,特别是涉及到容器(如C++中的`std::list`)的迭代操作时,一个常见的问题是迭代器失效。本文将深入探讨这个问题,并提供一个关于如何在删除元素时避免迭代器失效的示例。 首先,我们需要理解迭代器是什么...

    C++ 迭代器ppt 为什么无效

    5. **迭代器失效的情况**:迭代器可能因以下操作而失效: - 插入或删除元素,特别是在迭代器当前指向的位置。 - 改变容器的大小,如通过`resize`函数。 - 重新分配容器的内存,例如在`vector`的动态增长过程中。 ...

    关于vector迭代器失效的几种情况总结

    然而,由于其动态性,当我们对`vector`进行某些操作时,可能会导致迭代器失效,这在编程中是一个需要注意的重要问题。迭代器失效意味着,之前有效的迭代器不再指向原来的元素或者不再可用。下面是关于`vector`迭代器...

    C++与操作系统等面试题57

    迭代器是用于遍历容器中元素的对象,当容器内部结构发生变化时(如插入或删除操作),某些迭代器可能不再指向有效的元素位置,这种现象被称为迭代器失效。了解这一点非常重要,因为不当的操作可能会导致程序出现...

    cPP.rar_c++ 容器使用_容器

    - **迭代器失效(Iterator invalidation)**:某些操作(如插入、删除或容器大小调整)可能导致迭代器失效,这意味着它们不再指向有效的元素。在进行这些操作时,必须考虑到迭代器的生命周期。 - **算法...

    C++顺序容器,容器适配器,关联容器的操作

    - 对于`vector`、`string`和`deque`,插入和删除操作可能会导致迭代器失效。 - `list`和`forward_list`在添加删除操作时,迭代器、引用和指针仍然有效。 - 关联容器中的`map`和`unordered_map`的下标操作会返回一个`...

    vector list map 遍历删除制定元素 防止迭代器失效的实例

    然而,在遍历这些容器并删除元素时,如果不小心,可能会导致迭代器失效,从而引发运行时错误。下面将详细解释如何在遍历过程中安全地删除指定元素,以防止迭代器失效。 ### 1. `vector` 的遍历与删除 `vector` 是...

    关于迭代器的Demo

    - 某些操作如插入、删除元素可能导致迭代器失效,因此在进行这些操作后,需重新获取有效迭代器。 9. **迭代器的分类**: - 输入迭代器只能向前移动且只读,输出迭代器只允许写入; - 前向迭代器比输入迭代器多一...

    关于STL的erase()陷阱-迭代器失效问题的总结

    然而,使用`erase()`时需要特别注意的一个问题是迭代器失效,即在删除元素后,与该元素相关的迭代器将不再有效。本文将深入探讨这个问题,并通过实例分析在不同类型的STL容器中如何安全地使用`erase()`。 首先,让...

    C++ STL list 遍历删除出错解决方案

    在这个例子中,迭代器`it`在调用`erase()`后未被更新,导致`it`成为了一个无效迭代器,因为`erase()`会使得迭代器失效。代码如下: ```cpp for (TESTLIST::iterator it = t.begin(); it != t.end();) { t.erase(it...

    STL迭代器的说明

    使用插入迭代器可能会导致容器中的其他对象被移动,从而导致原本有效的迭代器失效。 #### 混合迭代器函数 除了上述迭代器类型外,STL还提供了一些迭代器操作函数,用于更灵活地控制迭代器的移动: - **`advance()...

    C++ 基本知识--容器(吴军).pptx

    添加或者删除元素会改变容器的内在状态或者移动容器的元素,从而使原迭代器失效。解决办法是判断所使用的迭代器是否失效,避免存储end操作返回的迭代器。 五、容器操作 容器操作包括: * 添加元素:Push_back(t)...

Global site tag (gtag.js) - Google Analytics