LoginSignup
31
19

More than 5 years have passed since last update.

2次元vectorをforループを使わずに初期化する

Last updated at Posted at 2018-08-17

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については下の記事を参考にしてください。

vectorなどのコンテナの内容をPythonみたいに簡単にcoutに出力する方法 - Qiita

31
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
19