C++ でベクトルのベクトルを作成
- C++ でデフォルトコンストラクタを使用してベクトルのベクトルを作成する
-
C++ で
rand
関数を使って任意の値を持つベクトルを埋める - 範囲ベースのループを使って C++ のベクトルの各要素を修正する
![C++ でベクトルのベクトルを作成](/img/Cpp/feature-image---vector-of-vectors-cpp.webp)
この記事では、C++ でベクトルのベクトルを作成する方法を説明します。
C++ でデフォルトコンストラクタを使用してベクトルのベクトルを作成する
ベクトルのベクトルを作成するということは、2 次元の行列を作成することを意味するので、コンストラクタのパラメータとして LENGTH
と WIDTH
を定義することにします。整数のベクトルを宣言するために必要な記法は vector<vector<int> >
です(最初の <
の後のスペースは可読性のためだけです)。
以下の例では、基本的に 4x6 次元の行列を宣言しています。この行列の要素は [x][y]
記法を用いてアクセスでき、リテラル値を用いて初期化されます。2 次元ベクトルの要素にアクセスするには、指定した位置で at
メソッドを 2 回呼び出す必要があることに注意してください。
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
constexpr int LENGTH = 4;
constexpr int WIDTH = 6;
int main() {
vector<vector<int> > vector_2d(LENGTH, vector<int>(WIDTH, 0));
vector_2d[2][2] = 12;
cout << vector_2d[2][2] << endl;
vector_2d.at(3).at(3) = 99;
cout << vector_2d[3][3] << endl;
return EXIT_SUCCESS;
}
出力:
12
99
C++ で rand
関数を使って任意の値を持つベクトルを埋める
ベクトルのベクトルは、複数の線形代数やグラフィックスのワークフローでよく使用されます。そのため、2 次元ベクトルをランダムな値で初期化するのが一般的です。初期化リストを用いて比較的大きな 2 次元ベクトルを初期化するのは面倒なので、任意の値を生成するためにループ反復と rand
関数を利用すべきです。
この場合は暗号的に敏感な操作を必要としないので、現在時刻を引数に指定した rand
関数で十分に乱数を生成することができます。ここでは、[0, 100)
の間隔で乱数を生成し、同時に各要素をコンソールに出力します。
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
constexpr int LENGTH = 4;
constexpr int WIDTH = 6;
int main() {
vector<vector<int> > vector_2d(LENGTH, vector<int>(WIDTH, 0));
std::srand(std::time(nullptr));
for (auto &item : vector_2d) {
for (auto &i : item) {
i = rand() % 100;
cout << setw(2) << i << "; ";
}
cout << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
出力:
83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;
範囲ベースのループを使って C++ のベクトルの各要素を修正する
一般的に、前の例で示したように std::vector
を用いて二次元の行列を宣言することは、レイテンシが重要なアプリケーションでは非常に非効率的で計算量が多くなる可能性があります。時間に敏感なアプリケーションでは、通常、古い学校の C スタイルの [][]
記法を用いて行列を宣言します。プラス面としては、std::vector
行列は、以下の例のように、範囲ベースのループを使って反復処理を行うことができます。
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
constexpr int LENGTH = 4;
constexpr int WIDTH = 6;
int main() {
vector<vector<int> > vector_2d(LENGTH, vector<int>(WIDTH, 0));
for (auto &item : vector_2d) {
for (auto &i : item) {
i = rand() % 100;
cout << setw(2) << i << "; ";
}
cout << endl;
}
cout << endl;
// Multiply Each Element By 3
for (auto &item : vector_2d) {
for (auto &i : item) {
i *= 3;
}
}
for (auto &item : vector_2d) {
for (auto &i : item) {
cout << setw(2) << i << "; ";
}
cout << endl;
}
return EXIT_SUCCESS;
}
出力:
83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;
249; 258; 231; 45; 279; 105;
258; 276; 147; 63; 186; 81;
270; 177; 189; 78; 120; 78;
216; 108; 33; 204; 201; 87