[英]Initializations of a vector
我看到了從C ++ 11中的數組(C樣式或std :: array)初始化向量的不同方法。 假設我有一個這樣的數組: uint8_t arr[5000]
或這樣的std::array<uint8_t, 5000> arr;
: std::array<uint8_t, 5000> arr;
舉個例子。
如果我想從arr中獲得5000個值,則可以通過以下方式對其進行初始化:
std::vector<uint8_t> vect(arr, arr + 5000);
std::vector<uint8_t> vect(std::begin(arr), std::end(arr));
std::vector<uint8_t> vect(arr.begin(), arr.end());
如果arr是std::array<uint8_t, 5000>
),則適用此方法
根據此答案 ,選項3優於選項1和2。最好使用容器的成員函數而不是非成員函數。
我總是看到c樣式數組的第一個選擇。 選項1是否與選項2完全相同? 其背后的微妙之處是什么?
謝謝你的幫助。
首選方法是將值直接放入向量中,而不是將它們放入數組中,然后使用它來初始化向量。
除此以外,使用自由函數std::begin
和std::end
的版本通常比其他版本更可取。 無論源是數組, std::vector
, std::array
還是其他容器之一,例如std::list
或std::set
。
后者顯然在通用代碼中最重要,因此它可以獨立於源容器的類型。 但是,即使在其他情況下,對於幾乎所有類型的輸入都可以使用相同的語法,這使您可以將其識別為高級模式,這是一件事,因此您無需花費腦力來弄清楚它在做什么。
有兩個明顯的缺點:
begin
和end
作為自由函數實現。 我認為,最好的解決方法是在需要時自己實施(最少的努力)。 container.begin()
和container.end()
。 修改現有的大型代碼庫以使用自由函數可能不切實際,並且將x.begin()
和begin(x)
將無法提高可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.