如何不擦除迭代器(从"Effective STL")
How not to erase an iterator (from "Effective STL")
我一直在阅读有效的stl。我被困在这里了:
assoccontainer<int> c
for(container<int>::iterator i=c.begin();i!=c.end();++i)
if(badvalue(*i))
c.erase(i);
给定的代码有什么问题?我不明白那里的解释。
我还有其他问题:
assoccontainer
是什么意思?我找不到任何相关的文章badvalue
是某种关键字吗
关联容器是什么意思?
它表示某种关联容器,例如std::set
。请注意,它是用斜体打印的,这意味着它不是真正的代码,而是实际容器类型的占位符。
"badvalue"是某种关键字吗?
不,它是由程序定义的一个函数,用于确定是否应从容器中删除值。上一页介绍了它,其中说"让我们消除下面谓词返回true的每个对象"。
给定的代码有什么问题
这在书中有解释,紧跟在代码示例之后。erase(i)
会使迭代器无效,这意味着您不能再使用它做任何事情,因此之后立即执行++i
会产生未定义的行为。相反,您需要使用稍后在同一页面上的代码:
for (AssocContainer<int>::iterator i = c.begin(); i != c.end(); /* nothing */) {
if (badValue(*i)) c.erase(i++);
else ++i;
}
其在擦除并使其旧值无效之前递增CCD_ 6。
assoccontainer
和badvalue
与主要问题无关。假设assoccontainer
是某个容器,badvalue
是某个返回布尔的函数。主要问题是在迭代器用于删除元素之后再使用它。在erase
迭代器无效并且不能再使用之后。
assocontainer相当于字典或哈希图,尽管作者(Scott Meyers?)可能在一般意义上使用了它。AFAIK,STL中没有该名称的容器;将其替换为std::map。我想这就行了。
您可以在此处找到有关它的更多信息:http://en.wikipedia.org/wiki/Associative_containers_(C%2B%2B)
它有一个计算字符串出现次数的简洁示例。
很可能Scott Meyers的意思是badvalue()是一个用户定义的函数,用于判断使用迭代器取消引用的值是否有效。
HTH。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 在C++中迭代 STL 集时出现奇怪的问题<CStudent>
- 如何在 C++17 STL 并行算法中处理调度?
- 如何不擦除迭代器(从"Effective STL")
- C++:斯科特·迈耶斯 "Effective STL":第 31 项:了解您的排序选项:帮助理解