为什么 erase() (貌似)不推进迭代器?

Why isn't erase() (seemingly) advancing the iterator?

代码在这里:http://codepad.org/zbJCVnL0

我这里的意思是图片:

while 循环查找列表中 '(' 或 ')' 值出现的位置并删除它们,然后在删除括号元素后输出(通过解除引用)列表的元素...但是它输出不应该再出现的内容!

在使用 iter = object.erase(iter) 后立即取消对迭代器的引用给出了应该被删除的前一个值。

但随后在下面的for循环中,使用解引用将列表完整显示,所有应该被删除的元素都被删除了,没有出现。 这里发生了什么?

只需手动仔细遵循代码的逻辑,您就会发现这就是它应该输出的内容。

比如为什么输出一个")"?那么,当你处理“)”之前的"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;