2015-12-28 29 views
0

代碼在這裏:http://codepad.org/zbJCVnL0爲什麼不擦除()(看起來)推進迭代器?

圖片的什麼我的意思是:

screenshot

的while循環,它發現在「(」或「)」列表中的值出現,並刪除它們,然後通過清除括號元素後輸出(通過取消引用)列表中的元素...但輸出不應該在那裏的東西!

在使用iter = object.erase(iter)之後立即解引用迭代器給出應該已被擦除的前一個值。

但是,在下面的for循環中,使用解引用完整地顯示列表,並且應該已經被擦除的所有這些元素被擦除並且不會出現。 這裏發生了什麼?

+0

你期望的輸出 –

+0

對於支架要刪除的COUT在while循環不這樣做,但是當for循環輸出列表時,括號不見了。 – Kostoglotov

回答

1

只需仔細地手工完成代碼的邏輯,您就會發現它應該輸出。

例如,它爲什麼輸出「)」?那麼,當你在「)」之前處理「d」時,你會發現「d」不是「(」或「)」,遞增迭代器並在遞增之後輸出它指向的內容,現在是「)」。

爲什麼它輸出的第二「(」?那麼,對於規則「),」以輸出後的字符,在這種情況下是「(」說。

您的代碼不正是你應該有預期改變你的代碼來報告它在做什麼可能更容易理解:?

cout << "starting loop" << endl; 
    while (sit != llist.end()) 
    { 
      cout << endl << "The iterator points to '" << *sit << "'." << std::endl; 
      if (*sit == '(') { cout << "Rule 1"; sit = llist.erase(sit); cout << *sit; } 

      else if (*sit == ')') { cout << "Rule 2"; sit = llist.erase(sit); cout << '\n' << *sit; } 

      else { sit++; if (sit != llist.end()) { cout << "Rule 3" ; cout << *sit; } } 
    } 
    cout << "loop finished" << endl; 
相關問題