2015-04-15 64 views
1

我的用例如下: 從二進制文件中讀取大小爲n的向量。std ::向量預分配(大小爲n,容量爲n + 2)

在其他的變種(輸入輸出流,在我的情況下自定義代碼做減壓),我可以做的語義是這樣的:

vector<myElem> v; 
v.resize(n); // from my understanding v now has size n and capacity n 
fread(v.data(), sizeof(myElem), n, myFile); 

可是,後來我將不得不(反覆)添加和刪除兩個元素到這樣一個向量。 (雖然這聽起來很愚蠢,但它可以給列表添加標記值,使得排序列表的交集不必爲邊界檢查添加比較)。爲此,我很想prealloacte一個大小爲n,容量爲n + 2的矢量。 我想我可以做這樣的事情:

vector<myElem> v; 
v.resize(n + 2); // from my understanding v now has size n + 2 and capacity n + 2 
v.pop_back(); 
v.pop_back(); // v now has size n and most probably still has capacity 2 (unless n is pretty small) 
fread(v.data(), sizeof(myElem), n, myFile); 

顯然,這既不漂亮,也不保證表現爲我liek它。在實踐中,我認爲它確實應該以這種方式表現大n,並且如果小n應該發生,重新分配並不重要。

不過,如果有更好的方法,聽聽會很高興。

編輯:

我不確定我怎麼能利用reserve在我的情況。如果我保留的容量爲n + 2,矢量的大小仍然爲0。如果我調整到n,我也改變了容量。

如果我先調整大小然後reserv,我分配兩次內存並複製整個向量。

+2

如果只有[函數](http://en.cppreference.com/w/cpp/container/vector/預留)設置容量。 –

+0

@MikeSeymour感謝您指出。據此編輯。 –

+0

不好邁克。這是一個問答網站。不是我們所有人都閱讀完整的STL文檔 – Gilad

回答

3

您可以使用v.reserve(n + 2)更改vector的容量而不更改其大小。看看documentation以更好地瞭解發生了什麼。

+0

謝謝,請您參考我最新的編輯內容嗎? 調整大小之前的儲備將被還原,之後的儲備將導致第二次分配,據我瞭解 –

+0

@ b.buchhold你爲什麼這麼認爲?調整大小並不會改變容量。容量只會在需要更多元素時纔會改變。見[這裏](http://www.cplusplus.com/reference/vector/vector/resize/) –

+0

好的謝謝。我想我誤解了我看過的參考資料。 –

1

你的能力的理解是不正確的報價:

v.resize(n); // from my understanding v now has size n and capacity n 

v有大小n,是的,但你能說的能力是,它是>= n。它可能是n,它可能是n + 1,它可能是3 * n。同樣的:

v.resize(n + 2); // from my understanding v now has size n + 2 and capacity n + 2 
v.pop_back(); 
v.pop_back(); // v now has size n and most probably still has capacity 2 (unless n is pretty small) 

在這一點上,我們可以肯定地說是v.size() == n && v.capacity() >= n + 2

如果你想要做的是

我很想prealloacte大小爲n和能力N A矢量+ 2

那麼這是乾脆:

v.reserve(n + 2); // capacity >= n+2, size == 0 
v.resize(n);  // capacity >= n+2, size == n 
0

你想要

v.reserve(n+2); 
v.resize(n); 

保證給你的尺寸的n和至少n+2的容量的載體:

23.3.7.3矢量容量

空隙儲備(SIZE_TYPE N)

...在保留() 調用之後發生的插入過程中,不會發生重新分配,直到插入將使vector的大小大於capacity()的值爲止。

空隙大小調整(SIZE_TYPE N)

...如果size() < sz appaends sz - size()默認插入元件,以該序列

所以調整爲比當前的大小更大相當於插入的元件,並且後一個儲備,沒有插入操作可以重新分配內存,直到其大小將超過預留容量...