std::array
とstd::vector
の違いは何ですか?いつ他のものを使用しますか?
私は常にstd:vector
をC配列を使用するC++の方法として使用し、検討してきましたが、違いは何ですか?
std::array
は、古典的なC配列の単なるクラスバージョンです。これは、コンパイル時にサイズが固定され、単一のチャンクとして割り当てられることを意味します(たとえば、スタック上のスペースを取得します)。オブジェクトと配列データの間に間接性がないため、パフォーマンスがわずかに向上するという利点があります。
std::vector
は、ヒープへのポインターを含む小さなクラスです。 (したがって、std::vector
を割り当てると、常にnew
が呼び出されます。)配列されたデータにアクセスするには、これらのポインターを追跡する必要があるため、アクセスが若干遅くなります。サイズを変更でき、どれだけ大きくても、取るに足らない量のスタックスペースしか使用しません。
[編集]
どちらを使用するかについては、std::vector
がほとんど常にあなたが望むものです。スタック上に大きなオブジェクトを作成することは一般的に眉をひそめられ、間接レベルの追加レベルは通常無関係です。 (たとえば、すべての要素を反復処理する場合、追加のメモリアクセスはループの開始時に1回だけ発生します。)
ベクトルの要素は連続していることが保証されているため、配列へのポインタを期待する関数に&vec[0]
を渡すことができます。例:Cライブラリルーチン。 (余談ですが、std::vector<char> buf(8192);
は、new
を直接呼び出さずに、read/write
または同様の呼び出しにローカルバッファを割り当てるのに最適な方法です。)
そうは言っても、その余分なレベルの間接性の欠如と、コンパイル時の定数サイズは、作成/破壊/アクセスが非常に小さい非常に小さな配列に対して、std::array
を大幅に高速化できます。
したがって、私のアドバイスは次のとおりです。(a)プロファイラーから問題があると言われない限り、std::vector
を使用してくださいおよび(b)配列が小さい。
Std :: arrayはコンパイル時にサイズが固定され、std :: vectorは可変サイズであることを知っていると仮定します。また、std :: arrayは動的割り当てを行わないことを知っていると仮定します。したがって、代わりにwhyと答えます。std:: vectorの代わりにstd :: arrayを使用します。
あなたはこれを自分で見つけたことがありますか?
std::vector<SomeType> vecName(10);
そして、あなたは実際にstd :: vectorのサイズを増やすことはありませんか?その場合は、std :: arrayが適切な代替手段です。
しかし、実際には、std :: array(初期化リストと組み合わせて)が存在し、Cスタイルの配列をほぼ完全に無価値にします。通常、std :: vectorsと競合しません。 Cスタイルの配列とより競合します。
Cスタイルの配列のほぼすべての正当な使用を抹消するために、C++委員会が最善を尽くしていると考えてください。
std::array
std::vector
よりも1つ少ない間接費を支払う良いユースケースは、C++の良さを保ち、生の配列のすべての悪いことを邪魔しないようにしながら、「金属に近い」ことをするときです。
std::vector
ではなく、Cスタイルstatic配列を使用するときの同じ理由。そのために、 here を紹介します。
std::array
のサイズは固定(コンパイル時)ですが、std::vector
は拡大できます。
そのため、std::array
はC配列を使用するようなものであり、std::vector
は動的にメモリを割り当てるようなものです。
Array<>
またはstd::array
と比較してよりシンプルなAPIを使用する、独自の手動コードstd::vector
テンプレートクラスを使用します。例えば:
動的配列を使用するには:
Array<> myDynamicArray; // Note array size is not given at compile time
myDynamicArray.resize(N); // N is a run time value
...
静的配列を使用するには、コンパイル時に固定サイズ:
Array<100> myFixedArry;
std::array
やstd::vector
よりも構文が優れていると思います。また、非常に効率的です。
ベクトルが配列に対して持つ利点の1つは、-を使用してベクトルのcurrent sizeを見つけることができることです- vector_name.size()。
ご想像のとおり、これはarray_listの要素の数を簡単に取得できるさまざまな状況で非常に役立ちます。