2次元配列(2次元vector)
2次元配列とは
2次元配列とは, 配列の中に配列が入っているようなものです. 例えばこういうの
{{1, 2, 3},
{4, 5, 6},
{7, 8, 9, 10}}
まあこれを表みたいに扱えばいいということですね! 大体こんな感じになります.
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 1 | 2 | 3 | null |
| 1 | 4 | 5 | 6 | null |
| 2 | 7 | 8 | 9 | 10 |
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;
}
}