2016-04-28 103 views
0

我有一個字符列表,我試圖刪除連續的重複項,例如{'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; 
     } 
    } 
} 

回答

3

聲明

itr2 = next(itr, 1); 

可能會給你的end迭代器,你必須檢查您嘗試取消對它的引用

喜歡的東西

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

謝謝你,這是完美的。 – Moose

3

列表中已經有一個函數可以刪除連續的重複項unique

myList.unique(); 

更新

要忽略外殼,那麼你可以使用unique算法版本。

auto end = std::unique(s.begin(), s.end(), [](char l, char r) 
{ 
    return tolower(l) == tolower(r) 
}); 
+0

謝謝,但我需要也忽略套管 – Moose

+0

更新以處理案件。 –

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

+0

儘管這樣更清潔,但從技術上說,您仍然使用從std :: prev()返回的另一個迭代器,就像使用從next()返回的迭代器的OP一樣。 –

相關問題