2013-10-23 182 views
1

我看到了不同的方法來初始化C++ 11中的數組(c樣式或std :: array)向量。 假設我有一個這樣的數組:uint8_t arr[5000]或者像這樣: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>

根據this answer,選項3比選項1和2更好。最好使用容器的成員函數而不是非成員函數。

我總是看到c樣式陣列的第一個選項。選項1是否與選項2完全相同?那背後有什麼微妙之處?

感謝您的幫助。

+0

實際上,所有的答案都建議使用選項2而不是選項3 - 對於實際實現'begin()'和'end()'方法的容器,無論如何它都會做同樣的事情。它也適用於C風格的數組,如果你有一些奇怪的包含非標準方法的容器來獲取它們的開始和結束迭代器,你可以隨時編寫自己的免費'begin'和'end'函數。 –

+0

你已經連接到**的問題中接受的答案不會**說使用成員函數更好。他只是指出在C風格的數組上也有free函數'begin'和'end'。正是這個原因,我會堅持免費的功能。 – Praetorian

+0

此外,選項1具有實際必須知道偏移量的明顯缺點。 :) –

回答

2

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

除此之外,使用免費功能std::beginstd::end的版本通常優於替代方案。無論源是數組,std::vector,std::array還是其他容器之一,例如std::liststd::set,它都可以工作。

後者在泛型代碼中顯然是最重要的,所以它可以獨立於源容器的類型。但是,除此之外,對於基本上所有類型的輸入都可以使用相同的語法,這使得您可以將其視爲高級模式,因此您不需要花費大腦週期來弄清楚它在做什麼。

有兩個明顯的缺點:

  1. 你可能需要的代碼移植到舊的編譯器,不執行beginend免費功能。在我看來,最好的治療方法是在需要時自行實施(儘量少用)。
  2. 您有一個現有的代碼庫,大量使用container.begin()container.end()。修改大型現有代碼庫以使用免費功能可能不實際,並且混合使用x.begin()begin(x)將無助於可讀性。