此处代码:http://codepad.org/zbJCVnL0
我在这里的意思:
while循环找到列表中'('或')'值的位置并将其删除,然后在删除括号元素后输出(通过解除引用)列表元素...但输出什么不应该在那里!
使用iter = object.erase(iter)后立即取消引用迭代器,得到应该删除的前一个值。
但是在接下来的for循环中,列表将使用解除引用完整显示,并且所有应该删除的元素都将被删除,并且不会出现。 这里发生了什么?
答案 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;