为什么 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;
代码在这里: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;