2013-05-31 174 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