为什么擦除()(似乎)推进迭代器?

时间:2015-12-28 18:33:21

标签: list stl erase

此处代码:http://codepad.org/zbJCVnL0

我在这里的意思:

screenshot

while循环找到列表中'('或')'值的位置并将其删除,然后在删除括号元素后输出(通过解除引用)列表元素...但输出什么不应该在那里!

使用iter = object.erase(iter)后立即取消引用迭代器,得到应该删除的前一个值。

但是在接下来的for循环中,列表将使用解除引用完整显示,并且所有应该删除的元素都将被删除,并且不会出现。 这里发生了什么?

1 个答案:

答案 0 :(得分:1)

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

例如,为什么输出")"?那么,当你处理" d"在")"之前,你会看到" d"不是"("或")",递增迭代器,并在递增它之后输出它指向的内容,现在是")"

为什么输出第二个"("?好吧,#34的规则;)"说输出后面的字符,在这种情况下是"("。

您的代码完全符合您的预期。更改代码以报告其执行的操作可能会使其更容易理解:

    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;