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;
}
この例も、生成される数値は実行のたびに異なります。
コメント