在迭代时修改数据结构

use*_*189 18 c++ iteration stl

在迭代数据结构时将元素添加到数据结构(例如向量)时会发生什么.我可以不这样做吗?

我尝试了这个,它打破了:

int main() {
    vector<int> x = { 1, 2, 3 };

    int j = 0;
    for (auto it = x.begin(); it != x.end(); ++it) {
        x.push_back(j);
        j++;
        cout << j << " .. ";
    }
}
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 15

某些修改a的操作会使迭代器失效std::vector.

其他容器有关于迭代器何时无效的各种规则.这是一篇文章(由您自己真实地)提供详细信息.

顺便说一句,入口点函数main() 必须返回int:

int main() { ... }
Run Code Online (Sandbox Code Playgroud)

  • 即使在返回int的情况下,也可以跳过从"main"返回.请参阅标准 (6认同)
  • 这不是真的正确.某些修改`std :: vector`的操作会使迭代器失效.修改`std :: vector`的内容而不修改它的拓扑结构对迭代器没有影响,也没有在迭代器指向的地方之后删除某些东西,也没有在迭代器指向的地方之后插入东西,**如果**容量足够. (2认同)
  • @Ben:在 Stack Overflow 上是恰当的,我指出了一个事实。这个问题最初(五年半前,当所有这些都被写出来时)里面有 `void main()`,这是错误的([尽管去年有人在编辑中更正了这一点](https:// stackoverflow.com/posts/5638323/revisions))。使满意? (2认同)

Naw*_*waz 11

在迭代数据结构时将元素添加到数据结构(例如向量)时会发生什么.我不能这个吗?

如果向量调整自身,迭代器将变为无效.所以只要矢量没有自己调整大小,你就是安全的.

我建议你避免这个.

重新调整大小使迭代器失效的简短解释:

最初向量具有一定的容量(你可以通过调用来知道vector::capacity()),然后向它添加元素,当它变满时,它会分配更大的内存,将元素从旧内存复制到新分配的内存,以及然后删除旧的内存,问题是迭代器仍然指向已经解除分配的旧内存.这就是调整大小使迭代器失效的方法.

这是简单的演示.只看到capacity变化时:

std::vector<int> v;
for(int i = 0 ; i < 100 ; i++ )
{
  std::cout <<"size = "<<v.size()<<", capacity = "<<v.capacity()<<std::endl;
  v.push_back(i);
}       
Run Code Online (Sandbox Code Playgroud)

部分输出:

size = 0, capacity = 0
size = 1, capacity = 1
size = 2, capacity = 2
size = 3, capacity = 4
size = 4, capacity = 4
size = 5, capacity = 8
size = 6, capacity = 8
size = 7, capacity = 8
size = 8, capacity = 8
size = 9, capacity = 16
size = 10, capacity = 16
Run Code Online (Sandbox Code Playgroud)

请在此处查看完整输出:http://ideone.com/rQfWe

注意: capacity()告诉向量在不分配新内存的情况下可以包含的最大元素数,并size()告诉向量当前包含的元素数.