2013-05-31 134 views
2

如果我有:调整大小嵌套的std ::矢量

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],这会导致其他人发生潜在的转移。

+2

不,这是不可能的。 – neagoegab

回答

4

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

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

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

+0

太棒了,这就是我想听到的。我也认为这可能是可能的,因为载体会像您提到的那样连续存储数据。作为一个侧面问题,什么是连续存储在父向量?指向连续存储的子矢量的指针是什么? – Justin

+1

@jucestain这是连续存储在父向量中的“子”向量对象本身。但是,请注意,这并不意味着孩子的'vector's'* data *全部在一个块中。这取决于实现,但很可能,一个'vector'对象本身只是存储一些指向堆分配数据的指针。这样,父向量的数据就是指针组的连续数组,每个指针指向它自己独立的连续内存块(对于一个孩子的'vector''数据)。 – Angew

+0

@Angew我明白了。谢谢! – Justin