std::seed_seq::seed_seq

来自cppreference.com
< cpp‎ | numeric‎ | random‎ | seed seq


 
 
 
 
 
seed_seq() noexcept;
(1)(C++11 起)
seed_seq( const seed_seq& ) = delete;
(2)(C++11 起)
template< class InputIt >
seed_seq( InputIt begin, InputIt end );
(3)(C++11 起)
template< class T >
seed_seq( std::initializer_list<T> il );
(4)(C++11 起)
1) 默认构造函数。构造后 v 为空。
2) 复制构造函数被弃置:std::seed_seq 不可复制。
3) 从范围 [beginend) 的值构造 std::seed_seq。等价于在默认构造 v 后执行 for (InputIt s = begin; s != end; ++s)
    v .push_back(modseed(*s));
,其中 mod_seed(x)=x mod 232
如果 std::iterator_traits<InputIt>::value_type 不是整数类型,那么程序非良构。
如果 InputIt 不满足老式输入迭代器 (LegacyInputIterator) 的要求,那么行为未定义。
4) 等价于 seed_seq(il.begin(), il.end())。此构造函数启用源自种子值列表的列表初始化
此重载只有在 T 是整数类型时才会参与重载决议。

参数

begin, end-表示初始种子序列的迭代器对
il-初始种子序列

示例

#include <iterator>
#include <random>
#include <sstream>
 
int main()
{
    std::seed_seq s1; // 可默认构造
    std::seed_seq s2{1, 2, 3}; // 能用列表初始化
    std::seed_seq s3 = {-1, 0, 1}; // 列表初始化的另一种形式
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::seed_seq s4(a, a + 10); // 能用迭代器
    std::istringstream buf("1 2 3 4 5"); 
    std::istream_iterator<int> beg(buf), end;
    std::seed_seq s5(beg, end); // 即使是流输入迭代器
}

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告应用于出版时的行为正确行为
LWG 2180C++11所有构造函数都不会抛出异常只有重载 (1) 不会抛出异常
LWG 3422C++111. 重载 (1) 不是 noexcept
2. 重载 (4) 没有被约束
1. 使之为 noexcept
2. 添加约束