簡體   English   中英

向量的初始化

[英]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個值,則可以通過以下方式對其進行初始化:

  1. std::vector<uint8_t> vect(arr, arr + 5000);

  2. std::vector<uint8_t> vect(std::begin(arr), std::end(arr));

  3. std::vector<uint8_t> vect(arr.begin(), arr.end()); 如果arr是std::array<uint8_t, 5000> ),則適用此方法

根據此答案 ,選項3優於選項1和2。最好使用容器的成員函數而不是非成員函數。

我總是看到c樣式數組的第一個選擇。 選項1是否與選項2完全相同? 其背后的微妙之處是什么?

謝謝你的幫助。

首選方法是將值直接放入向量中,而不是將它們放入數組中,然后使用它來初始化向量。

除此以外,使用自由函數std::beginstd::end的版本通常比其他版本更可取。 無論源是數組, std::vectorstd::array還是其他容器之一,例如std::liststd::set

后者顯然在通用代碼中最重要,因此它可以獨立於源容器的類型。 但是,即使在其他情況下,對於幾乎所有類型的輸入都可以使用相同的語法,這使您可以將其識別為高級模式,這是一件事,因此您無需花費腦力來弄清楚它在做什么。

有兩個明顯的缺點:

  1. 您可能需要將代碼可移植到較舊的編譯器,而這些編譯器沒有將beginend作為自由函數實現。 我認為,最好的解決方法是在需要時自己實施(最少的努力)。
  2. 您有一個現有的代碼庫,該代碼庫大量使用container.begin()container.end() 修改現有的大型代碼庫以使用自由函數可能不切實際,並且將x.begin()begin(x)將無法提高可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM