HOWTO · C++

C++ で 2D ベクトルを初期化する

この記事は、C++ で 2 次元ベクトルを初期化する方法と使用法に関するプログラミングガイドです。

このページの内容

この簡単なプログラミングチュートリアルは、C++ での 2D ベクトルの使用についてです。

2D ベクトルにジャンプする前に、まずベクトルと C++ での使用について簡単に説明します。次に、多次元ベクトルとその使用法に移ります。

C++ のベクトル

ベクトルは動的配列とまったく同じように機能し、要素の挿入または削除時に自動的にサイズを変更する機能が追加されています。ベクトルは、同種の要素(つまり、類似したデータタイプの要素)を格納できます。

ベクターは、追加と削除を行うことで、コンテナーまたはストレージのサイズを自動的に変更できます。

ベクターのすべてのメンバーはメモリに保存されます。次のすべての要素は前の要素に隣接しているため、反復子を介して簡単にアクセスできます。

新しい要素が追加されると、その要素は最後に配置され、メモリが使用可能かどうかを最初にチェックするため、挿入するたびに異なる時間がかかります。メモリが使用できない場合は、最初に新しいメモリを割り当ててから、要素をベクターに挿入します。

一方、最後の要素から要素を削除すると、削除のたびにサイズ変更が実行されないため、一定の時間がかかります。

C++ でベクトルを初期化する

C++ 標準テンプレートライブラリ(STL)にベクターライブラリファイルがあります。したがって、ベクターを使用するには、次のように、必要なヘッダーファイルを含める必要があります。

#include <vector>

ベクトルを宣言するには、次の構文に従います。

vector<int> v1;

ベクターは必要に応じて動的かつ自動的にサイズを拡大できるため、ベクターのサイズを指定する必要がないことに注意してください。イニシャライザリストまたは均一初期化を使用して、ベクトルを初期化できます。

これらの 2つの方法は、以下の例で示されています。

vector<int> vec1 = {21, 22, 23, 24, 25};  // initializer list method
vector<int> vec2{21, 22, 23, 24, 25};     // uniform initialization

ベクトル全体に同じ値を設定する場合は、ベクトルを初期化する別の方法があります。これを以下に示します。

vector<int> vec3(4, 11);

これにより、サイズ 4 のベクトルが初期化され、すべての要素の値は {11,11,11,11} のように 11 になります。

さらに、ベクトルを宣言した時点でベクトルにデータを入力しない場合は、後で関数 push_back を使用してデータを追加できます。この関数の構文は次のとおりです。

vec1.push_back(value);

これにより、値がベクトルの最後の要素として挿入されます。

C++ でベクトルの値にアクセスする

ベクトルでの反復には特定の方法があります。

関数 目的
begin() この関数は、ベクトルの最初の要素へのイテレーターポインターを返します。
end() この関数は、ベクトルの最後の要素へのイテレーターポインターを返します。
size() この関数は、ベクトルの合計サイズを返します。これは、要素の数を意味します。
at(p) この関数は、ベクトルの p の位置にある要素へのポインターを返します。
empty() この関数は、ベクトルが空かどうかをチェックします。

これらの関数は、次のコードスニペットで示されています。

#include <iostream>
#include <vector>
using namespace std;

int main() {
  vector<int> vec1;
  for (int j = 1; j <= 5; j++) vec1.push_back(j + 1);
  cout << "Size: " << vec1.size() << endl;
  cout << "Output of begin and end functions: ";
  for (auto a = vec1.begin(); a != vec1.end(); ++a) cout << *a << " ";
  cout << endl;
  cout << "Element at position 3: " << vec1.at(3) << endl;
  return 0;
}

出力:

Size: 5
Output of begin and end functions: 2 3 4 5 6
Element at position 3: 5

C++ で 2 次元ベクトルを初期化する

2D アレイと同様に、2D ベクトルもベクトルのベクトルです。そのようなベクトルの各要素は、ベクトル自体です。

Java のギザギザの配列と同様に、2D ベクトルの各位置に複数のサイズのベクトルを配置できます。これは、いくつかの行と列を持つマトリックスのように動作します。

違いは、各行に可変数の列を含めることができることです。

宣言の構文:

vector<vector<int>> vec1{{1, 1, 0}, {0, 2}, {2, 1, 3}};

これは 2D 構造であるため、このベクトルを反復処理するために 2つのループが必要です。1つは行をトラバースするためのループで、もう 1つは列をトラバースするためのループです。

for (int a = 0; a < vec1.size(); a++) {
  for (int b = 0; b < vec1[a].size(); b++) cout << v1[a][b] << " ";

size() 関数がベクトル内の要素の総数を返さないことを確認してください。代わりに、このベクトル内のベクトルの総数を返します。

次のように行と列の数を指定して、このベクトルを初期化することもできます。

int rows = 3;
int columns = 4;
vector<vector<int>> vec1(rows, vector<int>(columns));

2D ベクトルを作成するための完全なコードを見てみましょう。

#include <iostream>
#include <vector>
using namespace std;

int main() {
  int rows = 3;
  int columns = 4;
  vector<vector<int>> vec(rows, vector<int>(columns));
  for (int a = 0; a < rows; a++)  // loop for initializing the vector
  {
    for (int b = 0; b < columns; b++) {
      vec[a][b] = a * b;
    }
    cout << endl;
  }
  for (int a = 0; a < rows; a++)  // loop for displaying the values of vector
  {
    for (int b = 0; b < columns; b++) {
      cout << vec[a][b] << " ";
    }
    cout << endl;
  }
  return 0;
}

出力:

0 0 0 0
0 1 2 3
0 2 4 6