我一直在阅读有效的stl。我被困在这里:
assoccontainer<int> c
for(container<int>::iterator i=c.begin();i!=c.end();++i)
if(badvalue(*i))
c.erase(i);
给定的代码有什么问题?我不明白那里的解释。
我还有其他问题:
- 一个是什么
assoccontainer
意思?我找不到任何相关的文章。 - 是
badvalue
某种关键字吗?
我一直在阅读有效的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 的每个对象”。
给定的代码有什么问题
这在本书的代码示例之后立即进行了解释。erase(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
是一些返回布尔值的函数。主要问题是在用于删除元素后使用迭代器。之后erase
迭代器无效,不能再使用。
assoccontainer 相当于字典或哈希图,尽管作者(Scott Meyers?)可能在一般意义上使用它。AFAIK,STL 中没有该名称的容器;用 std::map 替换它。我想这应该可以解决问题。
您将在此处找到有关它的更多信息: http ://en.wikipedia.org/wiki/Associative_containers_(C%2B%2B )
它有一个计算字符串出现次数的简洁示例。
很可能 Scott Meyers 的意思是 badvalue() 是一个用户定义的函数,用于确定使用迭代器取消引用的值是否有效。
HTH。