C++ 如何不删除迭代器(从“有效STL”)
我一直在读有效的stl。我被困在这里:C++ 如何不删除迭代器(从“有效STL”),c++,containers,C++,Containers,我一直在读有效的stl。我被困在这里: assoccontainer<int> c for(container<int>::iterator i=c.begin();i!=c.end();++i) if(badvalue(*i)) c.erase(i); 给定的代码有什么问题?我不明白那里的解释 我还有其他问题: 什么是assoccontainer?我找不到任何相关的文章。 badvalue是某种关键字吗? 什么是assoccontainer 它表示某种关联
assoccontainer<int> c
for(container<int>::iterator i=c.begin();i!=c.end();++i)
if(badvalue(*i))
c.erase(i);
给定的代码有什么问题?我不明白那里的解释
我还有其他问题:
什么是assoccontainer?我找不到任何相关的文章。
badvalue是某种关键字吗?
什么是assoccontainer
它表示某种关联容器,例如std::set。请注意,它是以斜体打印的,这意味着它不是真正的代码,而是实际容器类型的占位符
“badvalue”是一个关键词吗
不,它是由程序定义的一个函数,用于确定是否应从容器中删除某个值。上一页介绍了它,其中说让我们消除下面谓词返回true的每个对象
给定的代码有什么问题
这在书中解释过,紧接着是代码示例。橡皮擦i使迭代器无效——这意味着你不能再使用它做任何事情了——这样做之后,++i立即给出了未定义的行为。相反,您需要在同一页面上使用后面的代码:
for (AssocContainer<int>::iterator i = c.begin(); i != c.end(); /* nothing */) {
if (badValue(*i)) c.erase(i++);
else ++i;
}
在擦除和使其旧值无效之前递增i。assoccontainer和badvalue与主要问题无关。假设assoccontainer是某个容器,badvalue是某个返回bool的函数。主要问题是在使用迭代器删除元素后使用迭代器。擦除后,迭代器无效,无法再使用。尽管作者Scott Meyers?可能是在一般意义上使用它。抱歉,STL中没有这个名称的容器;将其替换为std::map。我想这应该能奏效 您可以在此处找到有关它的更多信息: 它有一个计算字符串出现次数的简洁示例 Scott Meyers最可能的意思是,badvalue是一个用户定义的函数,用于确定使用迭代器取消引用的值是否有效
HTH.我猜您在遍历集合时会修改容器。修改应该使用迭代器完成。这个问题是使用一种伪代码来说明问题。当你知道这一点时,你也知道问题的答案。关键是在迭代器上调用erase。这个问题的更好标题可能是“示例使用我从未听说过的类”一书,或者“显示擦除迭代器问题的示例没有意义”。@jogojapan比我的建议要好得多。命名是一项关键技能。@PeterWood哦,我还没有注意到你的评论。对不起,是的,我希望标题现在可以了。当然,任何人都可以进一步改进。很有趣。c.i++是如何实现的;不同于橡皮擦;i++@辩证法:在递增i之后,第一次调用擦除旧值,因此i本身不会失效。第二个给出了未定义的行为。假设元素是1,2,3,4,5,让我们假设迭代器指向3。如果给出c.i++则删除4。其中,当给出第二个代码时,3被删除。@Saikiran:否,在这两种情况下,3都被删除,因为增量后i++在增量之前返回值。不同的是,在第一种情况下,我最终提到了4;在第二种情况下,它最终无效。我不知道我可以依赖于在函数调用之前解析参数列表中的所有内容。我总是在类似的情况下使用临时迭代器。我们每天都学到一些东西: