std :: vectorの初期サイズを設定するには?


130

私は持っていてvector<CustomClass*>、ベクターに多くのアイテムを入れており、高速アクセスが必要なので、リストを使用しません。ベクトルの初期サイズを設定する方法(たとえば、20 000桁にして、新しく挿入するときにコピーされないようにする)


1
std::vector参照には、コンストラクタと2つの関数があり、どちらがニーズに適しているかによって異なります。
クリス

1
初期値を設定しているだけではコピーできません。
juanchopanza

1
のコピーを避けますか?ポインタの保存は、コピーのコストの点でかなり軽量です。
user7116


1
@ダミール、あなたstd::vectorはタイトルで意味しましたか?
Robᵩ

回答:


180
std::vector<CustomClass *> whatever(20000);

または:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

前者は配列の実際のサイズを設定します-つまり、20000ポインターのベクトルにします。後者はベクターを空のままにしますが、20000のポインター用にスペースを予約するため、再割り当てすることなくその数だけ(最大で)挿入できます。

少なくとも私の経験では、これらのどちらかがパフォーマンスに大きな違いをもたらすことはかなりまれですが、状況によってはどちらが正確さに影響を与える可能性があります。特に、再割り当てが行われない限り、ベクターへのイテレーターは有効なままであることが保証されます。サイズ/予約済みスペースを設定すると、再割り当てが行われない限り、再割り当ては行われません。 tそれを超えてサイズを増やします。


どれが挿入/削除の数が多いほど効率的でしょうか?
CTOR

3
@Loggie:効率に違いがあるとは思えません。主にそれはあなたがそれをどのように使うかを変えます-前者では、あなたはポインタをアドレス指定するだけなのでwhatever[10000] = somepointer;、後者はあなたpush_backが追加する各ポインタにあなたを要求するようなものです。少なくとも、に慣れているvector場合は、後者の方がおそらくシンプルで自然です。
ジェリーコフィン

コピー元のコンテナーのサイズがわかっている場合、pushing_backの代わりにサイズ変更してからコピーする方が効率的ではないのはなぜですか?

1
@Cincinnatus:にはreserve、メモリサイズを事前に割り当てるへの呼び出しがあるためです。理論的には、アイテムを追加するたびに現在のサイズが増加することも回避されるため、サイズを設定することで、まだわずかに速くなる可能性があります。実際には、それを測定できるとは思えません。
Jerry Coffin

1
実際、これをホットパスで実行していて、コードが頻繁に呼び出される場合、多くの命令と時間の節約を行うことができます。
bayindirh 2014

15

初期割り当てサイズを設定するか、初期コンストラクターでそれを行うには、reserve関数を使用する必要があります。

vector<CustomClass *> content(20000);

または

vector<CustomClass *> content;
...
content.reserve(20000);

いつreserve()要素、vector多くの要素ということ(少なくとも?)のための十分なスペースを割り当てます。要素はには存在しませんvectorが、メモリを使用する準備ができています。これpush_back()により、メモリがすでに割り当てられているため、速度が向上する可能性があります。


サイズを割り当てることも(例えば整数の引数に渡すことで、建設中に提供することができますstd::vector<Custom Class*> content(100);
adelbertc

@kstruct:はい、しかしそれは効率が低下する可能性があります-非常に少量です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.