最終更新日時:
が更新

履歴 編集

function
<random>

std::seed_seq::コンストラクタ(C++11)

seed_seq();                                       // (1)

template<class T>
seed_seq(initializer_list<T> il);                 // (2)

template<class InputIterator>
seed_seq(InputIterator begin, InputIterator end); // (3)

seed_seq(const seed_seq&) = delete;               // (4)

概要

  • (1) : デフォルトコンストラクタ。空のシード列を構築する。
  • (2) : seed_seq(il.begin(), il.end())と同じ。
  • (3) : シード値を要素とするイテレータ範囲から、シード列を構築する
  • (4) : コピーコンストラクタ。コピー禁止。これによってムーブも禁止

要件

  • (2) : 型Tは整数型であること。
  • (3) : InputIteratorが指す値型が整数型であること。

効果

  • (1) : 空のシード列を構築する。
  • (2) : (3)のオーバーロードに転送する。

    seed_seq(il.begin(), il.end());
    

  • (3) : 以下のアルゴリズムで、シード列を構築する。

    for (InputIterator s = begin; s != end; ++s) {
      v.push_back((*s) % pow(2, 32)); // 32ビット整数の範囲に収める
    }
    
    // ※ `v`は、メンバ変数として保持される、`vector<result_type>`型のシード列オブジェクトである。
    

例外

  • (1) :
    • C++14 : 投げない

#include <iostream>
#include <random>
#include <vector>
#include <iterator>
#include <limits>

int main()
{
  // デフォルト構築
  {
    std::seed_seq seq;

    std::vector<std::uint32_t> result;
    seq.param(std::back_inserter(result));

    for (std::uint32_t x : result) {
      std::cout << x << ", ";
    }
  }
  std::cout << std::endl;

  // 初期化子リストによる構築
  {
    std::seed_seq seq = {1, 2, 3};

    std::vector<std::uint32_t> result;
    seq.param(std::back_inserter(result));

    for (std::uint32_t x : result) {
      std::cout << x << ", ";
    }
  }
  std::cout << std::endl;

  // イテレータ範囲による構築
  {
    std::vector<std::uint64_t> seed_data = {
      1,
      2,
      std::numeric_limits<std::uint64_t>::max()
        // 64ビットの最大値を入れる。seed_seqによって32ビット値に変換される。
    };

    std::seed_seq seq(seed_data.begin(), seed_data.end());

    std::vector<std::uint64_t> result;
    seq.param(std::back_inserter(result));

    for (std::uint64_t x : result) {
      std::cout << x << ", ";
    }
  }
}

出力例

1, 2, 3, 
1, 2, 4294967295, 

バージョン

言語

  • C++11

処理系

参照