我有一个字符列表,我正在尝试删除连续的重复项,例如{'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;
}
}
}
答案 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