C++の配列とベクトルの違いは何ですか?違いの例には、ライブラリ、シンボリズム、能力などが含まれます。
配列には、特定のタイプの特定の数の要素が含まれます。コンパイラーは、プログラムのコンパイル時に必要なスペースを確保できるように、定義時に配列に含める要素のタイプと数を指定する必要があります。コンパイラーは、プログラムのコンパイル時にこの値を決定できなければなりません。配列が定義されたら、インデックスとともに配列の識別子を使用して、配列の特定の要素にアクセスします。 [...]配列のインデックスはゼロです。つまり、最初の要素のインデックスは0です。このインデックススキームは、C++でのポインターと配列間の密接な関係、および言語がポインター演算用に定義する規則を示しています。
— C++ポケットリファレンス
ベクトルは、配列スタイルの
operator[]
ランダムアクセスを提供する動的にサイズ設定されたオブジェクトのシーケンスです。メンバー関数Push_back
は、コピーコンストラクターを介して引数をコピーし、そのコピーをベクトルの最後のアイテムとして追加し、そのサイズを1増やします。pop_back
は、最後の要素を削除することにより、まったく逆の処理を行います。ベクターの末尾からのアイテムの挿入または削除には一定の時間がかかり、他の場所からの挿入または削除には直線的な時間がかかります。これらはベクターの基本です。彼らにはもっとたくさんあります。ほとんどの場合、Cスタイルの配列よりもベクトルを最初に選択する必要があります。まず第一に、それらは動的にサイズ調整されます。つまり、必要に応じて成長できます。 C配列の場合のように、最適な静的サイズを見つけるためにあらゆる種類の調査を行う必要はありません。ベクトルは必要に応じて大きくなり、必要に応じて手動で大きくまたは小さくサイズ変更できます。次に、ベクターはat
メンバー関数(ただしoperator[]
ではない)で境界チェックを提供します。そのため、プログラムがクラッシュしたり、さらに悪い状態で実行を継続するのではなく、存在しないインデックスを参照する場合、何かを実行できます。— C++クックブック
配列:
malloc
で割り当てられている場合を除く)。sizeof
を使用できます(そのため、一般的なイディオムsizeof(arr)/sizeof(*arr)
。ただし、ポインターで不注意に使用すると暗黙のうちに失敗します)。std::vector
:
&vec[0]
は期待どおりに動作することが保証されています);begin()
/end()
メソッド、通常のSTL typedef
s、...を提供します)また、配列の「最新の代替」を検討してください-std::array
; 別の答えstd::vector
とstd::array
の違いで説明したので、ご覧ください。
C++では配列は非常に低レベルの構造であるため、「ロープを学ぶ」ときにはできるだけ配列から遠ざけるようにする必要があります。
ベクトルは、配列と同じパフォーマンスに非常に近くなりますが、非常に多くの便利さと安全機能を備えています。おそらく、生の配列を扱うAPIに接続するとき、または独自のコレクションを構築するときに、配列の使用を開始します。
これらの参照はあなたの質問にほとんど答えました。簡単に言えば、配列のサイズは固定ですが、ベクトルの長さは動的です。配列を使用する場合、宣言時にサイズを指定します。
int myArray[100];
myArray[0]=1;
myArray[1]=2;
myArray[2]=3;
ベクトルの場合は、宣言して要素を追加するだけです
vector<int> myVector;
myVector.Push_back(1);
myVector.Push_back(2);
myVector.Push_back(3);
...
時には、必要な要素の数がわからないので、そのような状況ではベクトルが理想的です。