2012-08-23 106 views
4

頭文件<random>允許種子序列的內部序列被初始化。類別seed_seq的對象可以以多種方式構建。我很好奇其中一種方式,特別是C++技術的使用方式。C++ 11 seed_seq初始化

我在看的網站在這裏:http://www.cplusplus.com/reference/std/random/seed_seq/seed_seq/

而在例子中,我看到這一行:

std::seed_seq seed2 = {102,406,7892}; 

正是這裏發生了什麼?看起來類對象正被分配給一個數組。我已經看過了初始化列表構造,複製賦值構造函數,並且我仍然對究竟發生了什麼感到困惑。

我明白std::seed_seq seed3 (foo.begin(),foo.end());std::seed_seq seed1;。第一代碼段(seed3)被調用seed_seq構造帶參數foo.begin()foo.end(),並且使用默認構造被構造的第二代碼段(seed1)。

+4

只是一個側面說明:cplusplus.com是一個糟糕的網站。使用http://cppreference.com。 – Xeo

+0

這是按構造初始化列表,不是?我期望這叫'seed_seq (initializer_list )'。 – cdhowie

+1

cppreference.com上也有一個例子。它在這裏:http://en.cppreference.com/w/cpp/numeric/random/seed_seq/seed_seq,我正在看這個例子的第8行。 – jrand

回答

5

我不知道我完全瞭解你的問題,因爲你自己已經幾乎給出了答案。使用類似{102,406,7892}是初始化程序列表。帶有像MyClass::MyClass(std::initializer_list<int> args)這樣的簽名的構造函數方法(或實際上任何方法)可以採用此方法。

您可以使用正常迭代器方法begin()end()來遍歷它。它基本上只是一種方便的方式,可以通過代碼中的任意長度的列表,而無需實例化「常規」std::liststd::vector(並且保持調用push_back())或數組。

作爲獎勵,你還可以使用構造初始化列表標準容器:std::vector<std::string> vec {"hello", "world"}。這允許您使用標準容器作爲參數類型來繼續使用initializer_list調用函數。

+1

列表初始化的內容。帶有一個braced-initializer-list的構造不需要調用'initializer_list'構造函數,儘管如果可用的話它將首選。 – ecatmur

+1

謝謝。從評論和這個網站:http://en.cppreference.com/w/cpp/language/list_initialization,它看起來只有一個構造函數方法,只有一個初始化列表或一個初始化列表作爲第一個參數,可以使用class_name class_object = {arg1,arg2,...}(網站語法的第10個例子) – jrand

+0

啊,是的,你當然也可以有一個標準容器作爲參數,因爲那些也可以從initializer_lists構造出來(正如我所說的xD) 。 –