【问题标题】:Resizing nested std::vectors调整嵌套 std::vectors 的大小
【发布时间】:2013-05-27 18:32:45
【问题描述】:

如果我有:

std::vector<std::vector<double> > vec

假设我为每个 vec[0], vec[1], ... vec[vec.size()-1] 分配空间。

如果我打电话:

vec[3].resize(100)

vec[3] 之前或之后分配的向量是否有可能被重新定位?

我问的原因是我有一个嵌套向量,如上面的 openmp 部分所示。每个线程控制vec[threadnum]。这些线程有一些调整大小。我想知道一个线程是否有可能调整vec[thread] 的大小,这会导致其他线程可能发生变化。

【问题讨论】:

  • 不,不可能。

标签: c++ memory stl openmp


【解决方案1】:

当您对向量执行调整大小(或调用任何其他方法)时,不会修改其他向量。

实际上,当你调用一个对象的方法时,其他不相关的对象并不会改变它们的状态。

如果我们想象所有向量都将它们的数据存储在公共连续内存块中,那么我们这里有向量向量这一事实可能会令人困惑。但事实并非如此。每个向量都有自己的内存区域,每个向量都可以独立重新分配内存(“父”向量根本不知道重定位)。

【讨论】:

  • 太好了,这就是我想听到的。我还认为这是可能的,因为正如您提到的,向量连续存储它们的数据。作为一个附带问题,什么是连续存储在父向量中的?指向子向量的指针是连续存储的吗?
  • @jucestain 是“子”vector 对象本身,它们连续存储在父向量中。但是请注意,这并不意味着子 vectors 的 data 都在一个块中。这取决于实现,但最有可能的是,vector 对象本身仅存储一些指向堆分配数据的指针。这样,父向量的数据将是一组连续的指针数组,每个指针都指向其自己单独的连续内存块(对于一个子 vector 的数据)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多