我有一个迭代一个向量的函数,并以某种方式调用另一个函数来执行它的内容。作为执行的结果,可以将新元素添加到向量中。功能代码如下:
void foo() {
for (std::vector<Item*>::iterator it = item_list.begin(); it != item_list.end(); ++it ) {
if (/*some condition*/) {
bar(it);
}
}
}
当我在google搜索这个问题时,我发现迭代器可能会在调整大小时失效,但作者并没有具体说明为什么,何时或什么是处理这个问题的正确方法。
答案 0 :(得分:2)
由于向量是随机访问,您可以临时存储距离并在之后重新创建迭代器:
void foo() {
for (std::vector<Item*>::iterator it = item_list.begin(); it != item_list.end(); ++it ) {
if (/*some condition*/) {
const auto d = std::distance( item_list.begin(), it );
bar(it);
it = item_list.begin();
std::advance( it, d );
}
}
}
答案假定在当前位置之后添加新元素,例如在结尾处。它还假设新元素也是迭代的一部分,即,它们也将针对some condition
进行检查,如果它们匹配,则会调用bar
。
答案 1 :(得分:1)
根据documentation,如果插入元素会更改vector
的容量,则所有迭代器都将失效。
要解决此问题,请将新项目添加到临时vector
并在完成后合并这两项。
答案 2 :(得分:0)
不是在交互中在该向量上插入更多项目,而是创建另一个向量来存储所有项目,并在迭代这个项目时进行大小调整,然后丢弃当前项目并交换该更新的向量。“ p>
这是标准的做法。