2012-08-23 114 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) 。 –