在修改<some_container>的大小时,可以安全地迭代std :: vector <some_container>吗?

时间:2015-09-21 17:53:53

标签: c++ stdvector

假设我有一些其他容器类型的向量。迭代向量时,我改变了容器的大小。鉴于向量试图在系统内存中保持连续,指针算法是否会在这样的循环中失败?例如,

#include <stdlib.h>
#include <vector>

using namespace std;

int main(){
  vector<vector<double> > vec_vec(4);
  for (auto i=vec_vec.begin(); i!=vec_vec.end(); ++i){
    for (double j=0; j<100; j+=1.0){
      i->push_back(j)
    };
  };

  return 0;
}

到目前为止,我使用这样的代码没有问题,但现在我想知道我是否幸运。这样安全吗?它取决于载体内使用的容器类型吗?

3 个答案:

答案 0 :(得分:4)

这完全没问题,你没有改变外部矢量。但是,不能保证所有向量在存储器中都是连续的。每个内在的内部都会,但不要指望它们在记忆中一个接一个地排列。

答案 1 :(得分:2)

您正在修改正在迭代的std::vector的内容。没有你迭代的矢量。它们是不同的东西。

第一个是安全的。由于最终的内存重新分配,第二个不安全。

答案 2 :(得分:0)

向量是一个固定大小的管理对象(大小,保留,指针),其指针指向的连续内存。

因此,您不会更改对象的大小