2次元vectorを全ての要素を同じ値で初期化したい場合、初期化する方法はいくつもあると思います。
ほとんどforループを必要としないNumPyに慣れてしまっていると、単なる初期化処理にforループを書くことにものすごく抵抗感があります。どうしてもforループを書きたくないので書かなくていい方法を探しました。
forループを使わずに短いコードで書ける方法として下の2つの方法が見つかりました。
1. コンストラクタで直接初期化する
この方法がもっとも短く書けると思いますが、何をやっているのか少し読みとりにくい感じがします。
# include <iostream>
# include <vector>
# include "cxx-prettyprint/prettyprint.hpp"
using std::vector;
int main() {
int n_rows = 5; // 行数
int n_cols = 3; // 列数
int value = 1; // 初期値
vector<vector<int>> vec(n_rows, vector<int>(n_cols, value));
// または
// auto vec = vector<vector<int>>(n_rows, vector<int>(n_cols, value));
std::cout << vec << std::endl;
}
出力
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
2. 空のvectorに後から値を割り当てる
最初に空のvectorとして宣言してから、assign関数で値を割り当てる方法もあります。
コードは1行増えますが、何をやっているのかは読み取りやすいと思います。
# include <iostream>
# include <vector>
# include "cxx-prettyprint/prettyprint.hpp"
using std::vector;
int main() {
int n_rows = 5; // 行数
int n_cols = 3; // 列数
int value = 1; // 初期値
vector<vector<int>> vec;
vec.assign(n_rows, vector<int>(n_cols, value));
std::cout << vec << std::endl;
}
出力
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
補足
値の出力にはcxx-prettyprintを使っています。cxx-prettyprintについては下の記事を参考にしてください。