C++ では、動的配列を作成するにはベクトルを使用する必要があることを理解しています。ただし、ベクトルに入力した情報を見つける必要がある場合は問題があります。
例:人の名前と書いた小さなメッセージを格納する単純なベクトルがあるとしましょう。ベクター内で、ビルがどこにいるかを見つけるにはどうすればよいですか。
この質問を投稿したとき、PHPでこれを行う方法も理解しようとしていました。
確かに、あなたは混乱しています。お手伝いさせてください。
おそらくあなたを混乱させる1つのこと: std::vector は幾何学的ベクトルではありません。メモリ内で連続しているのは、同じ型の一連のデータのみです。だから、それは配列のようなものです。
a) 変数に基づいてベクトルのサイズを決定します。たとえば、配列を使用していた場合、配列 [x][y] のようになります (これを行うことができないことはわかっています)。ベクトルでこれを行うにはどうすればよいですか
std::vector は、基本的に自動的に管理される動的配列です。
これは内部が配列であることを意味しますが、現在の容量が保持できるよりも多くのデータを追加しようとすると、配列が大きくなる (大きくなる) ことを確認するコードによって管理されます。
実際、std::vector はクラス テンプレートです。これは、実際のクラスではなく、コンパイラが実際のクラスを生成するために使用するコードであることを意味します。私が言うなら
std::vector<int> my_ints; // this is a vector of ints
このベクトルは int のみを保持できます。その後:
std::vector<std::string> name_list;
これは std::string オブジェクトを保持します。
おっしゃる通り、中身は配列を動的に管理するだけのコードです。前の例は、次のように考えることができます。
class
{
unsigned long size; // count of elements contained in this container
unsigned long capacity; // count of elements that the memory allocated by the array can hold
int* array; // array containing the values, created using new, destroyed using delete
}
my_ints;
これは内部の様子を単純化しすぎているため、まったく同じであるとは思わないでください。ただし、役に立つかもしれません。
これで、値を追加すると、値は配列のメモリ、まだ使用されていない要素 (たとえば push_back() を使用) にコピーされるか、既存の要素に上書きされます (たとえば、insert() を使用)。
値を追加し、ベクトルの容量がすべての値を保持するのに十分でない場合、ベクトルは自動的に大きくなります。より大きな配列が作成され、現在の値が内部にコピーされ、追加の値もコピーされてから削除されます。以前に持っていた配列。これを理解することが重要です。ベクトルが大きくなると、そのデータが常にメモリ内の同じアドレスにあるとは想定できないため、そのデータへのポインターは信頼できません。
b) 2 番目に、プッシュ バック コマンドを使用して変数の値を特定の場所に格納する方法を教えてください。繰り返しますが、配列を使用していた場合は、array[x][y] += q のようになります。x と y は配列内のスポットで、q は値です。
push_back() を使用して 2 つの値の間に値を追加するのではなく、insert() を使用します。
構文 array[x][y] += q は確かにあなたが説明したことをしません。配列[x][y]の位置の値にqを追加します。
配列はstd::vector
固定サイズであるため、 とは異なります。配列が存在する間、配列のすべての要素が存在します。デフォルトのコンストラクターでを作成するstd::vector
と、空になります。要素が含まれていないため、要素にインデックスを付けることはできません。
ただし、std::vector
初期サイズを取るコンストラクターがあります。コンストラクターに単一のint
引数を渡すstd::vector
と、デフォルトでその多くの要素が初期化されます。例えば:
std::vector<int> v(10); // Will have 10 ints
2D 配列に相当するものが必要な場合は、std::vector<std::vector<T>>
. 特定のサイズで構築したい場合は、上記のように外側のサイズを指定し、各要素を初期化する必要がある にstd::vector
渡す必要があります。std::vector
たとえば、10x20 のベクターが必要な場合:
// This will have 10x20 ints
std::vector<std::vector<int>> v(10, std::vector<int>(20));
これらの要素が存在すると、配列と同じようにインデックスを付けることができます。
int value = v[x][y];
std::array
C++11がコンパイル時の固定サイズを導入することは注目に値します。次のように使用できます。
std::array<std::array<int, 20>, 10> arr;
ただし、配列のサイズを変数で決定する場合は、これを使用できません。次元はコンパイル時の定数でなければなりません。