2次元配列(2次元vector)

2次元配列とは

2次元配列とは, 配列の中に配列が入っているようなものです. 例えばこういうの

{{1, 2, 3},
{4, 5, 6},
{7, 8, 9, 10}}

まあこれを表みたいに扱えばいいということですね! 大体こんな感じになります.

0123
0123null
1456null
278910

2次元配列の宣言

こういう感じでできます.

vector<vector<int>> a(3, vector<int>(4, 0)); // 3行4列の2次元配列を作る(0初期化)
vector<vector<int>> a(3, vector<int>(4)); // 3行4列の2次元配列を作る(初期化なし)
vector<vector<int>> a = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 初期化しながら作る

これは, 3行4列の2次元配列を作るという意味です.

2次元配列のアクセス

アクセスはこういう感じです.

a[0][0] = 1; // 1行1列目にアクセス
a[1][2] = 5; // 2行3列目にアクセス

まあ他の言語と変わらないですね(所見の人はサポートします)

2次元配列におけるいろんな関数の仕様について

2次元配列上でも, size(), emplace_back(), push_back(), sort()などの関数が使えまが, どう使うかで何が起こるのかが変化してきます.

説明では下記の配列を前提とします

vector<vector<int>> a = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
  • size() どこに対して使うかで返ってくる値が変わります.
a.size(); // 3が返ってくる(行数)
a[0].size(); // 4が返ってくる(1行目の列数)
  • sort()
sort(a.rbegin(), a.rend()); // 1行目の先頭の値を基準にして, 降順に並び替え
sort(a[0].rbegin(), a[0].rend()); // 1行目に対して, 降順に並び替え
  • emplace_back() / push_back() だいぶ特殊というか無理やり
a[0].emplace_back(5); // 1行目の末尾に5を追加
a.emplace_back(vector<int>{13, 14, 15, 16}); // 3行目の末尾に{13, 14, 15, 16}を追加

こんな感じで, 実際にvectorを作って追加する必要があります. まあ, 2次元配列の末尾に新しい行を追加するイメージですね.

適当なテストコードを置いときます.

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

int main()
{
    vector<vector<int>> arr = 
    {
        {1,2,3,4},
        {5,6, 7, 8},
        {9, 10, 11, 12}
    };

    sort(arr.begin(), arr.end(), greater<>());
    for(int i = 0;i < 3;i++)
    {
        for(int j = 0;j < 4;j++)
        {
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }

    cout << endl;

    sort(arr[0].rbegin(), arr[0].rend());
    sort(arr.begin(), arr.end(), greater<>());
    for(int i = 0;i < 3;i++)
    {
        for(int j = 0;j < 4;j++)
        {
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }

    cout << endl;

    arr[0].emplace_back(5);
    arr.emplace_back(vector<int>{13, 14, 15, 16});
    for(int i = 0;i < (int)arr.size();i++)
    {
        for(int j = 0;j < (int)arr[i].size();j++)
        {
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }

}

演習問題