C++ | vector の初期化パターン

C++ での vector を初期化するパターンをいくつか紹介します。

  • 任意の初期値で初期化
  • 固定値で初期化
  • 連番で初期化
  • 乱数で初期化

任意の初期値で初期化

初期化子リストを指定します。

#include <vector>

int main()
{
    std::vector<int> v{0, 1, 2, 3, 4};
    // v: [0, 1, 2, 3, 4]

    return 0;
}

固定値で初期化

vector のコンストラクタにて、第一引数にサイズ、第二引数に固定値を指定します。

#include <vector>

int main()
{
    std::vector<int> v(5, 1);
    // v: [1, 1, 1, 1, 1]

    return 0;
}

連番で初期化

std::iota を利用することで、連続した整数列で初期化します。

#include <vector>
#include <numeric>

int main()
{
    std::vector<int> v(5);
    std::iota(v.begin(), v.end(), 0);
    // v: [0, 1, 2, 3, 4]
    
    std::iota(v.begin(), v.end(), 5);
    // v: [5, 6, 7, 8, 9]

    return 0;
}

整数の乱数で初期化

整数の乱数で vector を初期化する例です。
0 以上 100 以下の一様乱数にしています。

#include <vector>
#include <random>
#include <algorithm>

int main()
{
    std::vector<int> v(10);

    std::random_device seed_gen;
    std::mt19937 engine(seed_gen());
    std::uniform_int_distribution<int> dist{0, 100}; // 0 以上 100 以下
    auto rng = [&engine, &dist]()
    {
        return dist(engine);
    };
    
    std::generate(v.begin(), v.end(), rng);
    // v: [62, 41, 19, 17, 17, 47, 61, 85, 68, 18]

    return 0;
}

生成される数値は実行のたびに異なります。
std::mt19937 engine の引数であるシードを、seed_gen() ではなく固定値にすることで、毎回同じ乱数を生成させることもできます。

浮動小数点数の乱数で初期化

実数の乱数で vector を初期化する例です。

#include <vector>
#include <random>
#include <algorithm>

int main()
{
    std::vector<double> v(10);

    std::random_device seed_gen;
    std::mt19937 engine(seed_gen());
    std::uniform_real_distribution<double> dist{0.0, 1.0}; // 0.0 以上 1.0 未満
    auto rng = [&engine, &dist]()
    {
        return dist(engine);
    };
    std::generate(v.begin(), v.end(), rng);
    // v: [0.429321, 0.619328, 0.53754, ...]

    return 0;
}

この例も、生成される数値は実行のたびに異なります。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次