迭代向量,同时迭代它

时间:2015-04-30 20:37:38

标签: c++ vector

我有一个迭代一个向量的函数,并以某种方式调用另一个函数来执行它的内容。作为执行的结果,可以将新元素添加到向量中。功能代码如下:

void foo() {
    for (std::vector<Item*>::iterator it = item_list.begin(); it != item_list.end(); ++it ) {
        if (/*some condition*/) {
           bar(it);
        }
    }
}

当我在google搜索这个问题时,我发现迭代器可能会在调整大小时失效,但作者并没有具体说明为什么,何时或什么是处理这个问题的正确方法。

3 个答案:

答案 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>

这是标准的做法。