c++ - 在迭代器上调用 erase(),但不删除正确的元素

标签 c++ list erase

我正在学习 C++ 并按照自己的方式使用双链表,但是当我尝试从列表中删除元素时,我注意到一些非常奇怪的事情。

问题:我在列表 numbers 的值 2 之前插入一个元素,然后我试图删除任何值为 1 的元素。

预期:在我的第一个循环的条件语句中调用 erase() 后,我的列表、数字应该得到调整。数字应包含的唯一值应包含 0,1234,2,3。

观察到:我的列表编号包含值 0、1、1234、2、3。就好像什么都没有被抹去一样。

代码示例:

#include "stdafx.h"
#include <iostream>
#include <list>

using namespace std;

int main()
{
   list<int> numbers; 

   numbers.push_back(1);
   numbers.push_back(2);
   numbers.push_back(3);
   numbers.push_front(0);

   list<int>::iterator it = numbers.begin();
   it++;
   numbers.insert(it, 100);
   cout << "Element: " << *it << endl;

   list<int>::iterator eraseIt = numbers.begin();
   eraseIt++;
   eraseIt = numbers.erase(eraseIt);
   cout << "Element: " << *eraseIt << endl;

   for (list<int>::iterator it = numbers.begin(); it != numbers.end(); it++)
   {
      if (*it == 2)
      {
         numbers.insert(it, 1234);
      }

      if (*it == 1)
      {
         it = numbers.erase(it);
      }
      else
      {
         it++;
      }
   }

   for (list<int>::iterator it = numbers.begin(); it != numbers.end(); it++)
   {
      cout << *it << endl;
   }

    return 0;
}

如果您能就此问题提供任何帮助,我将不胜感激。感谢您的时间。

最佳答案

您应该删除 for 循环声明末尾的 it++,因为它也可能在 for 循环内增加;当它增加两次时,一些元素将被跳过。即

for (list<int>::iterator it = numbers.begin(); it != numbers.end(); )

LIVE

关于c++ - 在迭代器上调用 erase(),但不删除正确的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48676285/

相关文章:

python:将列表转换为字符串,仅当 ','不存在时才添加 '|'

python - 使用 Python 按子字符串对字符串列表进行排序

C++ 删除循环问题中的 std::list 元素

c++ - 删除要从 vector 中删除的指针

python - 动态类型设计 : is recursivity for dealing with lists a good design?

c++ - 我如何使用 std :vector's erase() function properly?

c++ - Tensorflow Lite arm64 错误 : cannot convert ‘const int8x8_t?

c++ - std::codecvt_utf8 方面的问题

c++ - 事件系统的类型安全实现

c++ - 在 UML 工具中从 StateCharts 生成代码的要求