C++ でポインタのベクトルを作成する
胡金庫
2023年10月12日
-
C++ で
[]
表記を使用してポインタのベクトルを作成する -
new
演算子を使って C++ のダイナミックメモリ上にポインタのベクトルを作成する -
C++ で
std::vector
コンテナを用いてポインタのベクトルを作成する
この記事では、C++ でポインタのベクトルを作成する方法をいくつか説明します。
C++ で []
表記を使用してポインタのベクトルを作成する
ポインタ型は簡単に変更できるので、以下の例ではポインタのベクトルを宣言するために int *
を使用します。不透明なデータ構造を格納するために汎用のアドレス型が必要な場合や、逆にカスタム定義されたクラスへのポインタを使用する場合には、void *
ポインタを使用することもできます。
この解決策では、固定長の配列を宣言する C スタイルの配列記法 []
を用います。これは通常の配列宣言に似ていますが、この場合は各要素のアドレスにアクセスすることに興味があります。ベクトル内のポインタにアクセスしてコンソールに出力するために、&
(アドレス)演算子を利用しています。これらのメモリアドレスはスタックメモリ上にあることに注意してください。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
constexpr int WIDTH = 8;
int main() {
int *pointers_vec[WIDTH];
cout << "pointers_vec addresses:" << endl;
for (auto &i : pointers_vec) {
cout << &i << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
出力:
pointers_vec addresses:
0x7ffecd7a00d0
0x7ffecd7a00d8
0x7ffecd7a00e0
0x7ffecd7a00e8
0x7ffecd7a00f0
0x7ffecd7a00f8
0x7ffecd7a0100
0x7ffecd7a0108
new
演算子を使って C++ のダイナミックメモリ上にポインタのベクトルを作成する
一方、ヒープ上に動的に割り当てられたポインタのベクトルを作成するために new
演算子を利用することもできます。
この解決策では、プログラムが終了する前にプログラマがメモリを解放する必要があります。そうしないと、コードはメモリリークに悩まされることになります。動的に割り当てられたベクトルの各位置をクリーンアップするために delete []
記法を使用していることに注意してください。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
constexpr int WIDTH = 8;
int main() {
int *vector_of_pointers = new int[WIDTH];
cout << "vector_of_pointers addresses:" << endl;
for (int i = 0; i < WIDTH; ++i) {
cout << &vector_of_pointers[i] << endl;
}
cout << endl;
delete[] vector_of_pointers;
return EXIT_SUCCESS;
}
出力:
vector_of_pointers addresses:
0x2561c20
0x2561c28
0x2561c30
0x2561c38
0x2561c40
0x2561c48
0x2561c50
0x2561c58
C++ で std::vector
コンテナを用いてポインタのベクトルを作成する
std::vector
は、複数の組み込み関数を用いてポインタのベクトルを確保したり、ベクトルを操作したりするための豊富な機能を提供します。このメソッドは実行時に新しい要素を生成するためのより柔軟なインタフェースを提供します。次の例のように、ベクトルの要素を nullptr
の値で初期化していることに注意してください。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
constexpr int WIDTH = 8;
int main() {
vector<int *> vector_p(WIDTH, nullptr);
cout << "vector_p addresses:" << endl;
for (int i = 0; i < WIDTH; ++i) {
cout << &vector_p[i] << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
出力:
vector_p addresses:
0x1255c20
0x1255c28
0x1255c30
0x1255c38
0x1255c40
0x1255c48
0x1255c50
0x1255c58
著者: 胡金庫