迭代时删除列表中的最后一个元素会导致错误

时间:2016-04-28 08:11:14

标签: c++ list iterator

我有一个字符列表,我正在尝试删除连续的重复项,例如{'a', 'b', 'a', 'a', 'a'}变为{'a', 'b', 'a'}。当删除最后一个'a'itr2指向什么时,我得到一个“list iterator not dereferencable”错误。我理解为什么会发生这种情况,但我很难解决它。如何解决这个问题,有没有更好的方法来做到这一点?

这是我的代码:

void removeDuplicates(list<char> &myList)
{
    list<char>::iterator itr;
    list<char>::iterator itr2;
    for (itr = myList.begin(); itr != myList.end();)
    {
        itr2 = next(itr, 1);
        if (tolower(*itr) == tolower(*itr2))
        {
            myList.erase(itr2);
        }
        else
        {
            ++itr;
        }
    }
}

3 个答案:

答案 0 :(得分:3)

声明

end

可能会给你if (itr2 != mylist.end() && tolower(*itr) == tolower(*itr2)) { ... } 迭代器,你必须在尝试取消引用它之前检查它

这样的东西
{{1}}

答案 1 :(得分:3)

列表中已有一个函数可以删除名为unique的连续重复项。

module.exports = function() {
  console.log(this);
}

<强>更新

要忽略大小写,您可以使用unique的算法版本。

myList.unique();

答案 2 :(得分:0)

更简单的C ++ 11解决方案。您可以使用一个迭代器而不是2来解决此问题。只需将myList.erase分配回迭代器本身即可。这将删除当前元素并向前移动迭代器。

void removeDuplicates(list<char> &myList)
{
  list<char>::iterator itr;

  for (itr = myList.begin(); itr != myList.end();)
  {
    if (tolower(*itr) == tolower(*std::prev(itr)))
    {
        itr = myList.erase(itr);
    }
    else
    {
        ++itr;
    }
  }
  for (itr : myList)
    cout << itr <<" ";
}

工作ideone示例here