154

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

4

2 に答える 2

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

また:

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

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

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

于 2012-07-12T17:49:04.033 に答える
19

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

vector<CustomClass *> content(20000);

また

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

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

于 2012-07-12T17:48:50.210 に答える