C++ における std::vector と std::array の違い 質問する

C++ における std::vector と std::array の違い 質問する

std::vectorC++ の aと anの違いは何ですかstd::array? どちらを優先すべきですか? それぞれの長所と短所は何ですか? 私の教科書には、これらが同じ点を列挙しているだけです。

ベストアンサー1

std::vectorは、ヒープに格納され、要素が追加または削除されると自動的に拡大または縮小する動的配列1begin()をカプセル化するテンプレート クラスです。STL の残りの部分とうまく連携できるようにするためのフック ( 、、end()反復子など) がすべて用意されています。また、通常の配列では面倒な操作 (たとえば、ベクターの途中に要素を挿入するなど) を実行できる便利なメソッドもいくつかあります (後続の要素を移動する作業はすべてバックグラウンドで処理されます)。

要素はヒープ上に割り当てられたメモリに格納されるため、静的配列に比べてオーバーヘッドが発生します。

std::arrayは、静的サイズの配列をカプセル化し、オブジェクト自体に格納するテンプレート クラスです。つまり、スタック上でクラスをインスタンス化すると、配列自体もスタック上に存在することになります。そのサイズはコンパイル時にわかっている必要があり (テンプレート パラメーターとして渡されます)、拡大または縮小することはできません。

よりも制限は多いですstd::vectorが、実際には C スタイルの配列をラップした軽量なラッパーがほとんどなので、特にサイズが小さい場合には の方が効率的であることが多いです。ただし、ポインタへの暗黙的な変換が無効になっているため、より安全です。また、std::vectorや他のコンテナーの STL 関連機能の多くを提供するため、STL アルゴリズムなどで簡単に使用できます。いずれにしても、固定サイズという制限があるため、 よりも柔軟性がはるかに低くなりますstd::vector

の紹介についてはstd::array、こちらをご覧ください。この記事; の簡単な紹介とstd::vector、それに対して実行できる操作については、ドキュメンテーション


  1. 実際、標準では、さまざまな操作の最大複雑度 (たとえば、定数時間でのランダム アクセス、線形時間での全要素の反復、定数償却時間での最後の要素の追加と削除など) の観点から説明されていると思いますが、私の知る限り、動的配列を使用する以外に、このような要件を満たす方法はありません。 @Lucretiel が述べているように、標準では実際に要素が連続して格納されることが要求されているため、これは動的配列であり、関連付けられたアロケータが配置する場所に格納されます。

おすすめ記事