我的用例如下: 從二進制文件中讀取大小爲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,我分配兩次內存並複製整個向量。
如果只有[函數](http://en.cppreference.com/w/cpp/container/vector/預留)設置容量。 –
@MikeSeymour感謝您指出。據此編輯。 –
不好邁克。這是一個問答網站。不是我們所有人都閱讀完整的STL文檔 – Gilad