C++ でベクトルのベクトルを作成

胡金庫 2023年10月12日
  1. C++ でデフォルトコンストラクタを使用してベクトルのベクトルを作成する
  2. C++ で rand 関数を使って任意の値を持つベクトルを埋める
  3. 範囲ベースのループを使って C++ のベクトルの各要素を修正する
C++ でベクトルのベクトルを作成

この記事では、C++ でベクトルのベクトルを作成する方法を説明します。

C++ でデフォルトコンストラクタを使用してベクトルのベクトルを作成する

ベクトルのベクトルを作成するということは、2 次元の行列を作成することを意味するので、コンストラクタのパラメータとして LENGTHWIDTH を定義することにします。整数のベクトルを宣言するために必要な記法は 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Vector