web-dev-qa-db-ja.com

std :: arrayとstd :: vectorの違いは何ですか?いつ他のものを使用しますか?

std::arraystd::vectorの違いは何ですか?いつ他のものを使用しますか?

私は常にstd:vectorをC配列を使用するC++の方法として使用し、検討してきましたが、違いは何ですか?

114
Alok Save

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)配列が小さい。

154
Nemo

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++委員会が最善を尽くしていると考えてください。

22
Nicol Bolas

std::array

  • 集合体です
  • 固定サイズです
  • その要素はデフォルトで構築可能(vs copy(C++ 03)またはmove(C++ 0x)構築可能)である必要があります
  • 線形的に交換可能です(一定時間に対して)
  • 直線的に移動可能です(一定時間に対して)
  • 潜在的にstd::vectorよりも1つ少ない間接費を支払う

良いユースケースは、C++の良さを保ち、生の配列のすべての悪いことを邪魔しないようにしながら、「金属に近い」ことをするときです。

14
Luc Danton

std::vectorではなく、Cスタイルstatic配列を使用するときの同じ理由。そのために、 here を紹介します。

9
Xeo

std::arrayのサイズは固定(コンパイル時)ですが、std::vectorは拡大できます。

そのため、std::arrayはC配列を使用するようなものであり、std::vectorは動的にメモリを割り当てるようなものです。

8

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::arraystd::vectorよりも構文が優れていると思います。また、非常に効率的です。

2
Xiang

ベクトルが配列に対して持つ利点の1つは、-を使用してベクトルのcurrent sizeを見つけることができることです- vector_name.size()

ご想像のとおり、これはarray_listの要素の数を簡単に取得できるさまざまな状況で非常に役立ちます。

0
tech_boy