1. ホーム
  2. c++

[解決済み] std::arrayとstd::vectorの違いは何ですか?どのような場合にどちらを使うのでしょうか?重複

2022-09-25 18:50:39

質問

との違いは何ですか? std::arraystd::vector ? どのような場合にどちらを使用するのでしょうか?

私はいつも std:vector を C 配列を使用する C++ の方法として使用していましたが、この違いは何でしょうか?

どのように解決するのですか?

std::array は古典的な C 言語の配列のクラスバージョンに過ぎません。 つまり、そのサイズはコンパイル時に固定され、単一のチャンクとして割り当てられます(例えば、スタック上のスペースを取ります)。 このクラスの利点は、オブジェクトと配列データの間にインダイレクトがないため、パフォーマンスが若干良くなることです。

std::vector はヒープへのポインタを含む小さなクラスです。 (ですから std::vector を呼び出すと、それは常に new .) 配列されたデータに到達するためにポインタを追いかけなければならないので、アクセスに若干の遅れが生じます...。 しかし、その代わりにサイズを変更することができ、どんなに大きくても些細な量のスタックスペースしか取りません。

[編集]

どちらを使うべきかということについては、正直なところ std::vector を使いたい場合がほとんどです。 スタック上に大きなオブジェクトを作成することは一般に嫌われますし、余計な間接的なレベルは通常関係ありません。 (たとえば、すべての要素を繰り返し処理する場合、余分なメモリ アクセスはループの開始時に 1 回だけ発生します)。

ベクトルの要素は連続であることが保証されています。 &vec[0] を配列へのポインタを期待する関数、例えばCライブラリルーチンに渡すことができます。 (余談ですが std::vector<char> buf(8192); への呼び出しのためにローカルバッファを割り当てるには、 素晴らしい方法です。 read/write などを直接呼び出すことなく new .)

とはいえ、このような余分なレベルの間接化がないことと、コンパイル時の定数サイズによって std::array を大幅に高速化することができます。

というわけで、私のアドバイスはこうです。 を使うことです。 std::vector ただし、(a) プロファイラが問題ありとしている場合 (b) 配列が小さい場合。