17

手動の動的メモリ割り当ては一般的に悪い考えであることは知っていますが、たとえば、を使用するよりも良い解決策になる場合がありstd::vectorますか?

大まかな例を挙げると、n整数の配列を格納する必要があるとします。ここで、n<= 16 とします。私はそれを実装することができました

int* data = new int[n]; //assuming n is set beforehand

またはベクトルを使用する:

std::vector<int> data;

std::vector効率を高めるために、動的メモリを手動で割り当てる方が良いアイデアになる実際的な状況がある可能性がありますか?

4

7 に答える 7

16

少なくとも、特定の状況でソリューションがかなり高速であることを(プロファイリングを通じて)最終的に証明できるまでは、std::vector/を使用することをお勧めします。これが発生する可能性はほとんどありません。/は、単純な古いアレイの周りの非常に薄いレイヤーです。による境界チェックにはいくらかのオーバーヘッドがありますが、を使用することでそれを回避できます。std::arrayT* a = new T[100];vectorarrayvector::atoperator[]

于 2013-03-08T12:40:56.590 に答える
4

事前に (特にコンパイル時に) サイズが分かっていて、 の動的なサイズ変更機能を必要としない場合は、std::vectorより単純なものを使用しても問題ありません。

ただし、std::arrayC ++ 11を使用している場合、またはboost::scoped_arrayそれ以外の場合は、それが望ましいです。

コードサイズなどを大幅に削減しない限り、効率が大幅に向上するとは思えませんが、とにかく価値のある表現力があります。

于 2013-03-08T12:38:42.330 に答える
4

可能な限りC-style-arraysを避けるようにしてください。C++STL、通常、あらゆるニーズに十分対応できるコンテナを提供します。配列の再割り当てや途中の要素の削除を想像してみてください。コンテナーは、これを処理することを防ぎますが、自分で処理する必要があります。これを 100 回実行していないと、エラーが発生しやすくなります。
例外はもちろん、コンテナに対処できない可能性のある低レベルの問題に対処している場合ですSTL

このトピックについては、すでにいくつかの議論が行われています。SOのこちらをご覧ください。

于 2013-03-08T12:41:46.193 に答える
3

std::vector を使用することは絶対に常に良い考えですか、それとも動的メモリを手動で割り当てることが効率を高めるために良い考えになる実際的な状況があるのでしょうか?

私を単純な人と呼んでください。しかし、99.9999...% の場合、私は標準のコンテナーを使用します。デフォルトの選択は である必要がありますstd::vectorstd::deque<>、妥当なオプションである場合もあります。コンパイル時にサイズがわかっている場合はstd::array<>、C スタイルの配列の軽量で安全なラッパーであり、オーバーヘッドがゼロである を選択します。

delete[]標準コンテナはメンバー関数を公開して、メモリの初期予約量を指定するため、再割り当てで問題が発生することはなく、配列を覚えておく必要もありません。正直なところ、手動​​のメモリ管理を使用する理由がわかりません。

含まれている要素にアクセスするためにスローするメンバー関数とスローしないメンバー関数があるため、効率は問題になりません。そのため、安全性とパフォーマンスのどちらを優先するかを選択できます。

于 2013-03-08T12:42:30.093 に答える
2

std::vectorは、指定された要素数でベクターをインスタンス化し、単一の動的割り当て (配列と同じ) を行う size_type パラメーターを使用して構築できます。また、予約を使用して、再割り当ての数を減らすことができます使用時間。

于 2013-03-08T12:43:21.900 に答える
1

Innはコンパイル時に認識されるため、次のように選択する必要がありますstd::array

std::array<int, n> data; //n is compile-time constant

nコンパイル時に不明な場合、または実行時に配列が大きくなる可能性がある場合は、次のようにしstd::vectorます。

std::vector<int> data(n); //n may be known at runtime 

または、場合によっては、あるシナリオstd::dequeよりもどちらが速いかを好むこともあります。std::vectorこれらを参照してください。

それが役立つことを願っています。

于 2013-03-08T12:42:00.557 に答える