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

时间:2018-02-08 02:00:40

标签: c++ list erase

我正在学习c ++,我正在以双链表的方式工作,但当我试图从列表中删除元素时,我发现了一些非常奇怪的东西。

问题:我在列表中的值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;
}

我非常感谢对此问题的任何帮助。感谢您的时间。

2 个答案:

答案 0 :(得分:5)

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

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

LIVE

答案 1 :(得分:0)

在当前位置进行任何删除/插入之前,记住下一个迭代器值就足够了。这将帮助您不断地对您的修改具体和何时进行具体操作。

list<int>::iterator it = numbers.begin();
while (it != numbers.end()) {
{
list<int>::iterator next_it = it;
++next_it;

// Do your insertion or deletion here

it = next_it;
}