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()返回的迭代器一样。