Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何不删除迭代器(从“有效STL”)_C++_Containers - Fatal编程技术网

C++ 如何不删除迭代器(从“有效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 它表示某种关联

我一直在读有效的stl。我被困在这里:

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;在第二种情况下,它最终无效。我不知道我可以依赖于在函数调用之前解析参数列表中的所有内容。我总是在类似的情况下使用临时迭代器。我们每天都学到一些东西: