Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代时删除列表中的最后一个元素会导致错误_C++_List_Iterator - Fatal编程技术网

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

C++ 迭代时删除列表中的最后一个元素会导致错误,c++,list,iterator,C++,List,Iterator,我有一个字符列表,我正在尝试删除连续的重复字符,例如{'a','b','a','a','a'}变成{'a','b','a'}。当删除最后一个'a'itr2时,没有指向任何内容,我得到一个“列表迭代器不可解引用”错误。我理解为什么会发生这种情况,但我很难解决它。如何解决这个问题?有没有更好的方法 这是我的密码: void removeDuplicates(list<char> &myList) { list<char>::iterator itr;

我有一个字符列表,我正在尝试删除连续的重复字符,例如
{'a','b','a','a','a'}
变成
{'a','b','a'}
。当删除最后一个'a'
itr2
时,没有指向任何内容,我得到一个“列表迭代器不可解引用”错误。我理解为什么会发生这种情况,但我很难解决它。如何解决这个问题?有没有更好的方法

这是我的密码:

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;
        }
    }
}
void removeDuplicates(列表和myList)
{
列表::迭代器itr;
列表::迭代器itr2;
for(itr=myList.begin();itr!=myList.end();)
{
itr2=下一个(itr,1);
如果(tolower(*itr)=tolower(*itr2))
{
myList.erase(itr2);
}
其他的
{
++itr;
}
}
}
声明

itr2 = next(itr, 1);
可能会给您提供
end
迭代器,您必须在尝试取消引用它之前检查该迭代器

差不多

if (itr2 != mylist.end() && tolower(*itr) == tolower(*itr2)) { ... }
声明

itr2 = next(itr, 1);
可能会给您提供
end
迭代器,您必须在尝试取消引用它之前检查该迭代器

差不多

if (itr2 != mylist.end() && tolower(*itr) == tolower(*itr2)) { ... }

列表中已经有一个函数用于删除调用的连续重复项

更新

若要忽略大小写,则可以使用的算法版本


列表中已经有一个函数用于删除调用的连续重复项

更新

若要忽略大小写,则可以使用的算法版本


一个更简单的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 <<" ";
}
void removeDuplicates(列表和myList)
{
列表::迭代器itr;
for(itr=myList.begin();itr!=myList.end();)
{
如果(tolower(*itr)=tolower(*std::prev(itr)))
{
itr=我的列表擦除(itr);
}
其他的
{
++itr;
}
}
用于(itr:myList)

cout一个更简单的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 <<" ";
}
void removeDuplicates(列表和myList)
{
列表::迭代器itr;
for(itr=myList.begin();itr!=myList.end();)
{
如果(tolower(*itr)=tolower(*std::prev(itr)))
{
itr=我的列表擦除(itr);
}
其他的
{
++itr;
}
}
用于(itr:myList)

非常感谢,但我还需要忽略casingUpdated来处理案例。谢谢,但我也需要忽略casingUpdated来处理案例。谢谢,这很完美。谢谢,这很完美。虽然这更干净,但从技术上讲,您仍然在使用另一个迭代器,它是从
std::prev()返回的
,就像OP使用从
next()
返回的迭代器一样虽然这更干净,但从技术上讲,您仍然在使用从
std::prev()
返回的另一个迭代器,就像OP使用从
next()返回的迭代器一样。