C++における2Dベクトル- 実践的なガイド2Dベクトル
C++において、2次元のベクトルはベクトルのベクトルとも呼ばれ、行列やテーブル、または他の構造物を動的に作成する際の基礎となります。C++における2次元ベクトルの話題に入る前に、C++で1次元のベクトルを使用するチュートリアルを参考にすることがおすすめです。
ベクトルのヘッダーファイルを含める
プログラムの冒頭に含まれるヘッダーファイルさえなければ、C++でベクトルを使用することは不可能です。2Dベクトルを利用するためには、以下を含めます。
#include<vector>
1つずつ様々な種類の標準テンプレートライブラリ(STL)を含める代わりに、私たちはすべてを一度に含めることができます。
#include<bits/stdc++.h>
C++で2次元ベクトルを初期化する
まず、2次元ベクトルの初期化方法のいくつかを学びます。以下のコードスニペットでは、要素がすべて既知の場合の2次元ベクトルの初期化方法を説明しています。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<vector<int>> v {{1, 0, 1}, {0, 1}, {1, 0, 1}};
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
上記のコードを実行すると、以下の出力が得られます。
1 0 1
0 1
1 0 1
「vector<vector<>>」の使用は、私たちがベクトルのベクトルで作業していることを表しています。最初の括弧内の各値、「{1, 0, 1}」や「{0, 1}」などは、それぞれが独立したベクトルです。
注意: C++で異なるデータ型の2Dベクトルを作成するには、のように内部の最も角括弧にデータ型を配置することができます。
二次元のデータ構造を扱っているため、効率的なデータ構造全体の走査には、2つのループが必要です。外側のループは行を移動し、内側のループは列を走査します。
注: ‘size()’関数は、2Dベクトル内のベクトルの数を提供します。各個々のベクトル内の要素の合計数ではありません。
2Dベクトルの初期化時にサイズを指定する
2Dベクトルは大きなサイズになることがあります。プログラマにすべての値を入力してもらうことは期待できません。そこで、行数と列数を基に2Dベクトルを初期化することができます。
#include<iostream>
#include<vector>
using namespace std;
int main(){
//Number of columns
int num_col = 3;
// Number of rows
int num_row = 4;
// Initializing a single row
vector<int> row(num_col, 0);
// Initializing the 2-D vector
vector<vector<int>> v(num_row, row) ;
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
出力は次のようになります。 (Shutsuryoku wa tsugi no you ni narimasu.)
0 0 0
0 0 0
0 0 0
0 0 0
標準のベクトルの初期化「vector v(10, 0)」によれば、最初の引数はベクトルのサイズを表し、2番目の引数は各セルが持つデフォルトの値を表します。
上記のコードスニペットでは、標準の初期化の2つのステップに従います。
- ‘vector row(num_col, 0)’ – In this statement, we create a single-dimensional vector called ‘row’, which has length defined by ‘num_col’ and default values as ‘0’. It basically forms each row of our two-dimensional vector.
- ‘vector<vector> v(num_row, row) – In this statement, we create our complete two-dimensional vector, by defining every value of the 2-D vector as the ‘row’ created in the last statement.
上記の手順を理解した後、C++での2Dベクトルの初期化を改善することができます。
#include<iostream>
#include<vector>
using namespace std;
int main(){
//Number of columns
int num_col = 3;
// Number of rows
int num_row = 4;
// Initializing the 2-D vector
vector<vector<int>> v(num_row, vector<int> (num_col, 0)) ;
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
上記のコードは、私たちが全く同じことをしているが、1行のコードで行っているため、以前と同様の出力を提供します。
正しく記憶している限り、標準的な初期化は上記のものに似ています。二次元ベクトルを作成する際には、各要素のデフォルト値を一次元ベクトルとして設定する必要があります。
最後の方法は、行や列の知識なしで2次元ベクトルを作成することです。次のように行われます:
vector<vector<int>> v;
上記の宣言は、ベクトルの形で要素を保存することが可能な空のコンテナを作成します。
2次元ベクトルのイテレータ
C++には、2Dベクターをインデックスでトラバースする代わりに、それぞれのSTLデータ構造に対してイテレータの機能が用意されています。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<vector<int>> v {{1, 0, 1}, {0, 1}, {1, 0, 1}};
// Iterator for the 2-D vector
vector<vector<int>>::iterator it1;
// Iterator for each vector inside the 2-D vector
vector<int>::iterator it2;
// Traversing a 2-D vector using iterators
for(it1 = v.begin();it1 != v.end();it1++){
for(it2 = it1->begin();it2 != it1->end();it2++)
cout<<*it2<<" ";
cout<<endl;
}
}
出力:
1 0 1
0 1
1 0 1
特定の操作に位置を指定する引数が必要な場合、イテレータが便利です。イテレータの値を返す最も使用される2つの関数は次の通りです。
- ‘v.begin()’ – It returns an iterator to the first vector in a 2-D vector.
- ‘v.end()’ – It returns an iterator to the end of the 2-D vector.
2次元ベクトルで可能ないくつかの操作を見てみましょう。
2次元ベクトルに要素を追加する
二次元ベクトルの末尾に要素を追加するためには、「push_back()」関数を使用します。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// Initializing the 2-D vector
vector<vector<int>> v;
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
出力:
1 0 1
0 1
1 0 1
私たちのコンテナは、ベクトルのベクトルなので、それに完全なベクトルを追加することは意味があります。したがって、’push_back()’関数に渡される引数はベクトルでなければなりません。
注意: ‘v[i]’ は、1次元のベクトルを表します。したがって、プログラマーが2次元のベクトル内の特定のベクトルに要素を追加する必要がある場合は、’v[i].push_back(value)’を使用することができます。
特定の位置に完全なベクトルを追加するために、私たちは「insert()」関数を使用します。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// Initializing the 2-D vector
vector<vector<int>> v;
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
// Iterator for the 2-D vector
vector<vector<int>>::iterator it = v.begin();
// Inserting the vector = {1, 2, 3} as the second vector
v.insert(it + 1, {1, 2, 3});
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
出力:
結果:
1 0 1
1 2 3
0 1
1 0 1
「insert()」関数において、位置指定の引数としてイテレータを受け取る必要があります。指定された場所に挿入するベクトルがそれに続きます。
C++において2Dベクトルから要素を削除する方法
C++には、与えられたベクトルから最後の要素を削除する役割を持つ ‘pop_back()’ 関数が存在します。’push_back()’ とは逆に、この関数を利用します。
この記事の文脈において、「pop_back()」関数は2次元ベクトルから最後のベクトルを削除する責任があります。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// Initializing the 2-D vector
vector<vector<int>> v ;
// Adding vectors to the empty 2-D vector
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
// Remove the last vector from a 2-D vector
v.pop_back();
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
出力:
1 0 1
0 1
‘pop_back()’関数に加えて、指定したインデックスから要素を削除する’erase()’関数もあります。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// Initializing the 2-D vector
vector<vector<int>> v ;
// Pushing vector inside the empty 2-D vector
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
// Iterator for the 2-D vector
vector<vector<int>>::iterator it = v.begin();
// Remove the second vector from a 2-D vector
v.erase(it + 1);
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
出力:
1 0 1
1 0 1
‘insert()’ 関数と同様に、反復子として位置引数が必要です。2次元ベクトルからすべてのベクトルを削除するには、’clear()’ 関数を使用することができます。
C++の2次元ベクトルを使う際には、上記の機能で快適に利用できるかもしれません。
結論
C++において、二次元ベクトルを使うことは非常に簡単ですが、プログラマーは関連する構文について認識している必要があります。行列、グラフ、及び他の二次元オブジェクトに関連する問題を解決する際には、この種類のベクトルが便利です。
このチュートリアルが2次元ベクトルの使用に関する読者の理解を高めることを願っています。もしトピックに関連する質問がありましたら、下記へのコメントを自由にどうぞ。