【问题标题】:Calling erase() on an iterator, but not deleting correct element在迭代器上调用 erase(),但不删除正确的元素
【发布时间】:2018-02-08 02:00:40
【问题描述】:

我正在学习 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;
}

我将不胜感激任何有关此问题的帮助。感谢您的时间。

【问题讨论】:

  • 您的循环无效。如果在列表中插入或删除,它会使迭代器无效。
  • @Barmar 不,std::list::insert 不会使迭代器无效,并且对于 erase,OP 已使用从 erase 返回的迭代器重新分配 it

标签: c++ list erase


【解决方案1】:

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

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

LIVE

【讨论】:

  • 你确定执行erase(it)后(it)会是一个有效的迭代器吗?
  • @AndreySScherbakov Yes 在erase之后迭代器失效;这就是为什么 OP 使用返回的 erase 迭代器重新分配它。
  • 如果元素的初始数量是奇数,代码甚至会有未定义的行为。很好,它很容易修复。 :-)
【解决方案2】:

在当前位置进行任何删除/插入之前记住下一个迭代器值就足够了。这将帮助您不必担心您的修改具体在做什么以及何时进行。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2016-04-15
    • 2020-03-18
    相关资源
    最近更新 更多