1. ホーム
  2. c++

[解決済み] C++におけるstd::vectorとstd::arrayの比較

2022-03-17 19:29:40

質問

との違いは何ですか? std::vectorstd::array をC++で使うことはできますか?どのような場合にどちらを優先すべきでしょうか?それぞれの長所と短所は何でしょうか?私の教科書では、それらがどのように同じであるかを列挙しているだけです。

解き方は?

std::vector は、動的な配列である 1 ヒープに格納され、要素が追加または削除されると自動的に成長または縮小します。これは,すべてのフック( begin() , end() イテレータなど)があり、STLの他の部分とうまく動作します。また、通常の配列では面倒な操作、例えばベクトルの途中に要素を挿入する(後続の要素を移動させる作業はすべて裏で処理される)ような操作を可能にする便利なメソッドもいくつか持っています。

ヒープ上に確保したメモリに要素を格納するため、静的配列と比較して若干のオーバーヘッドが発生します。

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

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

への導入は std::array をご覧ください。 この記事 を簡単に紹介します。 std::vector とその上で可能な操作については、その ドキュメント .


  1. 実際、標準では異なる操作の最大複雑度(例えば、一定時間でランダムアクセス、線形時間で全要素の反復処理、一定償却時間で末端の要素の追加と削除など)で記述されていると思いますが、AFAIKでは動的配列を使う以外にそのような要件を満たす方法はないでしょうね。 Lucretiel が述べているように、実際には規格では要素が連続的に格納されることが要求されていますので それは 動的な配列で、関連するアロケータがそれを置く場所に格納されます。