如果我想將容量設置爲std::vector
,則必須致電.reserve(...)
,有沒有任何理由說明stl,std::string
,std::vector
中容器的構造函數中沒有容量參數?爲什麼在容器的構造函數中沒有容量參數?
回答
有一個明顯的原因:這樣的構造函數是什麼樣的?
所有的序列容器都有一個可以用一個整數參數調用的構造函數。該構造函數將容器的大小調整爲具有指定數量的元素。
是的,您可以添加第二個參數(如bool reserve_instead_of_resize
),以便能夠將此構造函數用於初始大小調整和初始保留,但是我認爲最終結果會令人困惑。
它可以採取另一種,對於保留的大小不同的整數參數 - 除了將與衝突在「T = size_t」的情況下,初始值的不同'const T&'參數(並且在其他情況下可以與另一個可轉換的情況下混淆)。 – 2011-04-26 15:42:39
是的。還有一致性的問題:保留只對向量有意義,所以我們最終會爲vector創建另一個構造函數。我認爲所有的(或大多數)其他構造函數都可用於所有的序列容器(儘管字符串確實有一些額外的構造函數,但它也不是泛型容器)。對於它的價值,我很少使用儲備。作爲一種優化,它有時是有用的,但我認爲,不足以保證另一個構造函數。 – 2011-04-26 15:53:51
我很偶爾使用'reserve'不是作爲優化,而是爲了防止重新分配的語義效應 - 迭代器和指針失效以及異常的可能性。我同意這不是真的值得一個構造函數,或者更確切地說是現有構造函數的一組重複項。在最糟糕的情況下,我認爲你想用不重要的內容來構建並保留,而且你害怕重新分配的成本。所以你需要構造空的,然後保留,然後插入內容。 – 2011-04-26 16:01:44
你可以簡單地做一個函數用於創建一個保留的向量:
// make_reserved_vector
template <typename... T>
std::vector<T...> make_reserved_vector(size_t n) {
std::vector<T...> vec;
vec.reserve(n);
return vec;
}
和使用:
auto myvec = make_reserved_vector<int>(32768);
這是一個好主意。這解決了這個問題,但是C++庫仍然有一個固有的問題:你可能不得不支付兩個內存分配(第一個向量構造函數,當你不知道默認容量是什麼時),然後第二個(當你預留和可能的釋放和重新分配)。您的解決方案充分利用了這一點,但我認爲C++委員會需要重新審視這個問題。 – rts1 2016-04-01 17:52:11
@ rts1:的確,這也是我的擔憂。可能會有一個'默認尺寸儲備',然後我們打電話給另一個儲備。可能有多個構造函數,一個取大小。 – 2016-08-21 17:07:15
相當古老的q/a,但在某處我必須釋放我的沮喪;)我不明白爲什麼在初始容量和初始大小之間進行選擇時,他們會選擇大小。如果我們可以選擇初始容量,那麼施工後可以更改尺寸而無需額外費用。就像現在一樣,我要麼需要一個可能不需要或者可能支付兩次以獲得我想要的容量的大小的矢量。 Imho反對C++的第一原則,不支付你不需要的東西。無論如何,你的函數可能是處理它的最好方法 – user463035818 2017-04-12 11:34:21
要創建載體,並在同一時間,指定其容量,創建具有所需容量的矢量,將其複製到您想要的元素中,並從通過複製返回的迭代器中擦除。 如果構造函數很慢,只需使用只保留內存的特殊參數編寫另一個構造函數即可。
int main (int argc, char** argv) {
std::vector<size_t> v (10, 0);
size_t tmp [3] = {0, 1, 2};
std::vector<size_t>::iterator i (v.begin());
i = std::copy ((const size_t*)tmp, (const size_t*) &tmp [3], v.begin());
v.erase (i, v.end());
std::cout << "\tv capacity == " << v.capacity() << std::endl;
}
將輸出:
V容量== 10
如果元素的構造函數有副作用(或者只是慢),那麼這與創建一個空向量然後保留一些容量有不同的行爲。 – 2017-02-21 10:25:17
如果控制器速度很慢,請在您的類中創建一個只保留內存的foo構造函數 – 2017-02-21 12:02:31
- 1. 沒有參數的構造函數或參數構造函數
- 2. 爲什麼System.Data.SqlClient.SqlDataReader沒有構造函數
- 3. 爲什麼STL容器沒有虛擬析構函數?
- 4. 爲什麼元組沒有無參數構造函數,而`[Serializable]`?
- 5. Mootools中的構造函數語法,容器的參數(noob)
- 6. 爲什麼優先級隊列構造函數需要比較器的容量?
- 7. 在沒有編譯器定義的移動構造函數的容器中顯式移動構造函數?
- 8. 爲什麼StringBuffer允許StringBuffer作爲其構造函數的參數,即使StringBuffer沒有StringBuffer構造函數?
- 9. 從Unity容器中自動解析構造函數參數
- 10. 將無參數構造函數設置爲容器創建中的注入構造函數
- 11. 爲什麼沒有在fill_n中調用移動構造函數
- 12. 構造函數參數中沒有名字的變量?
- 13. 空的構造函數和沒有構造函數有什麼區別
- 14. 爲什麼allocator在構造函數中?
- 15. 與構造StructureMap容器參數
- 16. 爲什麼默認構造函數在父類中是必需的,如果它具有參數構造函數?
- 17. 爲什麼$ {}變量在我的上下文文件中沒有被解釋爲構造函數參數值?
- 18. PhoneApplicationPage沒有無參數構造函數
- 19. System.Data.Entity.Spatial.DbGeography - 沒有無參數構造函數
- 20. 爲什麼IllegalAccessError不具有雙參數構造函數?
- 21. C#依賴容器和構造函數
- 22. 使用仿函數沒有對STL容器的默認構造函數
- 23. 爲什麼沒有使用可變參數的List構造函數?
- 24. 爲什麼C++在迭代容器時調用複製構造函數?
- 25. 爲什麼ConcurrentQueue中沒有容量?
- 26. 爲什麼servlet中沒有構造函數?
- 27. 爲什麼編譯器會抱怨超類沒有構造函數,當默認的構造函數被自動賦予一個沒有構造函數的類?
- 28. 爲什麼在C#中的泛型參數沒有構造函數參數約束?
- 29. 爲什麼我無法從私有類中的參數化構造函數調用默認構造函數?
- 30. 爲什麼這個構造函數調用另一個沒有參數?
矢量確實有一個構造函數大小 – 2011-04-26 14:47:23