web-dev-qa-db-ja.com

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

vector<CustomClass*>があり、ベクターに多くのアイテムを配置し、高速アクセスが必要なので、リストを使用しません。ベクターの初期サイズを設定する方法(たとえば、20000の場所に、新しい挿入時にコピーを避けるため)?

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

または:

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

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

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

147
Jerry Coffin

Reserve関数を使用して、初期割り当てサイズを設定するか、初期コンストラクターで設定する必要があります。

vector<CustomClass *> content(20000);

または

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

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

11
user195488