2017-02-18 56 views
1

如果我有std::vector<std::set<int>>。如果插入過去的容量,矢量將重新分配。在矢量內有另一個可調整大小的類型的情況下,矢量是否只包含指向該類型的指針?C++包含容器的容器的增長?

特別是我想知道如何分配內存如果一個向量是任意類型。

std::vector<int> a(10); //Size will be sizeof(int) * 10 
std::vector<std::set<int>> b(10); 
b[0] = {0, 0, 0, 0, 0, 0, 0, .... }; //Is b's size effected by the sets inside? 
+0

'std :: set'是可移動的,或者你在問什麼? –

+1

你在混合這些條款。矢量的大小是它所保存的元素的數量。在你的例子中,'b'的大小是10,它不會改變 – user463035818

+0

不一定是std :: set。如果我有一個向量,向量,並且被包含的類型在大小上發生變化,主向量是否會增長?我怎麼知道它不會。編譯器如何決定? –

回答

2

任何向量將自行分配的內存將始終爲sizeof(element_type)* vector.size()。

該向量只能分配內存元素數據,在編譯時可見。它不關心元素類所做的任何分配。

將矢量想象成類固醇上的數組。就像一個數組,一個向量由一個連續的內存塊組成,其中所有元素都具有相同的大小。爲了滿足這個要求,它必須在編譯時知道每個元素的大小。

試想一個std ::設置有這些成員變量:

struct SomeSet 
{ 
    size_t size; 
    SomeMagicInternalType* data; 
}; 

所以不管如何data在運行時分配,矢量只分配每個元素存儲它所知道的編譯時間

的sizeof(SomeSet ::大小)+的sizeof(SomeSet ::數據)

這將是4 + 4 32位機器上。

+0

我明白了,我擔心變大的部分就在堆上。 –

0

A std::vector<T>保存T類型的對象。當它被調整大小時,它會根據需要複製或移動這些對象。 A std::vector<std::set<int>>也不例外;它擁有std::set<int>類型的對象。

3

C++對象只能有一個大小,但可能包含指向任意大小的堆內存的指針。所以,是的,容器對象本身通常包含一個指向堆內存的指針,可能不包含任何實際的項目。 (唯一的典型的例外是字符串類型,其有時具有「小串優化」,允許字符串對象到直接包含在對象小弦不分配堆內存。)

1

考慮這個例子:

#include <iostream> 
#include <vector> 

int main() {  
    std::vector<int> v; 
    std::cout << sizeof(v) << "\n"; 
    std::cout << v.size() << "\n"; 

    v.push_back(3); 
    std::cout << sizeof(v) << "\n"; 
    std::cout << v.size() << "\n";  
} 

確切數量可能會有所不同,但我得到作爲輸出:

24 
0 
24 
1 

一個vector的尺寸(大小=物體的大小)時,添加元素不發生變化。 set也是如此,因此vector<set>如果其中一個元素添加或刪除元素,則不需要重新分配。

一個集合不會將其元素存儲爲成員,否則具有不同數量元素的集合將是不同的類型。它們存儲在堆中,因此不直接影響set的大小。