メモ

いろいろ

C++の多次元配列についての備忘録

配列の使い勝手がMATLABやCと違ったので,「APG4b T - 2.03.多次元配列」を参考にして要点を記録する.

・APG4b T - 2.03.多次元配列 (ページ下部に図解が大量にあってわかりやすい)

atcoder.jp

不正確だったり勘違いしている部分も多いと思われるので追記する予定.

前提としてC++14の環境で,

  #include <bits/stdc++.h>
  using namespace std;

  int main( ) {
  /* この部分 */
  }

を書いていると思ってください.

目次

多次元配列は配列の宣言を入れ子にする

1次元配列は vector<型> 配列変数名; を基本にして次のように宣言するのだった.

・APG4b N - 1.13.配列

atcoder.jp

  vector<int> vec; // 空の1次元配列

  vector<int> vec(3); // 要素が3個の1次元配列(3個とも0)

  vector<int> vec = {1,2,3}; // 要素を指定して初期化した1次元配列

2次元配列は次のようにvector<vector<int>>のように入れ子にして宣言する.

  vector<vector<int>> vvec; // 空の2次元配列

  vector<vector<int>> vvec = {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9},
  }; // 要素を指定して初期化した2次元配列(3x3 行列)

  vector<vector<int>> vvec(4, vector<int> (3, 0)); // (4x3 行列)

3つ目の記法vector<vector<要素の型>> 配列変数名(要素数1, vector<要素の型>(要素数2, 初期値))を特に忘れる.

直感的には「3列のゼロベクトルを4行並べた行列」のようなイメージだろうか.

[2019/3/11 追記] 初期値の扱い

初期値は省略することができる.省略した場合は要素の型に対応するゼロ値で初期化される.

  • int ならば数値の 0
  • string ならば空文字列の ""

[2019/3/11 追記ここまで]

要素へのアクセスは1次元配列を拡張したような形になる

1次元配列vec i番目の要素にアクセスするには,vec.at(i) を使うのだった.

cpprefjp.github.io

2次元配列vvec i j列目の要素にアクセスするには次のようにする.

  vvec.at(i).at(j);

例(2次元配列の要素へのアクセス)

適当な3×3行列を用意し,行列の要素に順にアクセスして二重forループで順に出力すると以下のようになる.

  vector<vector<int>> vvec = {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9},
  };

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      cout << vvec.at(i).at(j);
    }
  }

結果:

123456789

(0,0),(0,1),(0,2),(1,0),...,(2,1),(2,2)と順にアクセスしていることが確認できる.

多次元配列の大きさの取得方法

  • 縦の大きさは配列変数名.size()で取得
  • 横の大きさは配列変数名.at(0).size()で取得

[2019/3/11 追記] すべての要素数を取得する時は「縦の要素数 * 横の要素数」で求める

2次元配列をvvecとすると,全要素数

number = vvec.size() * vvec.at(0).size();

とすると取得できる. [2019/3/11 追記ここまで]

例(2次元配列の大きさの取得)

適当な5×7行列を用意し,サイズを取得してみる.

  // int型の5x7要素の2次元配列の宣言
  vector<vector<int>> vvec(5, vector<int>(7));

  cout << vvec.size() << endl; // 縦の大きさ(要素数)
  cout << vvec.at(0).size() << endl; // 横の大きさ

結果:

5
7

おわりに

2019/03/11現在まででC++の配列について知ったことは以上の通りでした.