5

1000個の「ノード」を持つベクトルがあります

 if(count + 1 > m_listItems.capacity())
     m_listItems.reserve(count + 100);

問題は、補充しようとしているときにもそれをクリアすることです。

m_listItems.clear();

容量は変わりません。私はresize(1);を使用しました。しかし、それは容量を変えるようには見えません。では、どのように準備金を変更するのでしょうか?

4

5 に答える 5

20
vector<Item>(m_listItems).swap(m_listItems);

m_listItems再び縮小します: http ://www.gotw.ca/gotw/054.htm (ハーブサッター)

とにかくそれをクリアしたい場合は、空のベクトルと交換してください:

vector<Item>().swap(m_listItems);

もちろん、これははるかに効率的です。(ベクトルを交換するということは、基本的に2つのポインターを交換することを意味することに注意してください。実際に時間のかかる作業はありません)

于 2008-11-25T23:52:57.213 に答える
2

他の人が提案したようにベクトルを交換できます.http://www.gotw.ca/gotw/054.htmで説明されているように、無料ではないことに注意してください. vector は、新しい、より小さなメモリのチャンクを割り当て、古い内容をすべてコピーする必要があります。(スワップ操作は基本的に無料ですが、無料ではない元のベクトルのデータのコピーで初期化された一時的なものと交換しています)

ベクトルの大きさが事前にわかっている場合は、最初に適切なサイズを割り当てる必要があるため、サイズ変更は必要ありません。

std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements

また、事前に容量がわからない場合、少しのスペースを無駄にするかどうかが問題になるのはなぜですか? 数キロバイトのメモリを節約するためだけに、すべての要素を新しい小さなベクトルにコピーするのに費やす価値はありますか (これは std::vector(v).swap(v) が行うことです)。

同様に、ベクトルをクリアするとき、とにかく再充填するつもりなら、その容量をゼロに設定することは、印象的な時間の無駄のようです.

編集

baash05: 10 メガの RAM に 1000000 個のアイテムがあるとしたらどうでしょう。オーバーヘッドの量を減らすことは重要だと思いますか?

いいえ。ベクトルのサイズを変更すると、一時的により多くのメモリが必要になるため、メモリが限られている場合は、アプリが壊れる可能性があります。(それらを交換する前に、メモリ内に元のベクトル一時的なベクトルを保持する必要があるため、その時点で最大 2 倍の RAM を使用することになります)。その後、少量のメモリ (最大で数 MB) を節約できますが、これは問題ではありません。これは、ベクター内の余分な容量がアクセスされることはなく、ページファイルにプッシュされるためです。そもそもRAM制限にカウントされます。

1000000 個のアイテムがある場合は、最初にベクトルを正しいサイズに初期化する必要があります。

それができない場合は、通常、容量をそのままにしておいたほうがよいでしょう。特に、ベクターを補充するつもりだと述べたので、常にすべてを割り当て、再割り当て、コピー、および解放するのではなく、すでに割り当てられている容量を確実に再利用する必要があります。

考えられるケースは 2 つあります。保存する必要がある要素の数を知っているか、知らないかのどちらかです。わかっている場合は、最初に正しいサイズでベクターを作成できるため、サイズを変更する必要がないか、わからない場合は、余分な容量を保持することもできます。少なくともベクトルを補充するときに上向きにサイズ変更する必要はありません。

于 2008-11-26T00:13:21.430 に答える
1

ここからこのテクニックを試すことができます

std::vector< int > v;
// ... fill v with stuff...
std::vector< int >().swap( v );
于 2008-11-25T23:51:50.897 に答える
1

swap必要な容量を持つ新しいベクトルでそれを行うことができます。

vector< int > tmp;
old.swap( tmp );
于 2008-11-25T23:52:23.110 に答える
1

私の知る限り、これまでよりも低い容量にベクトルを再割り当てすることはできません。大きく割り当てることしかできません。これには正当な理由があります。その中には、再割り当てプロセスが非常に計算集約的であるというものがあります。本当に小さいベクトルが必要な場合は、古いベクトルを解放して、小さい新しいベクトルを作成します。これは、ベクトルのサイズを実際に小さくするよりも、実際には計算上はるかに簡単です。

于 2008-11-25T23:53:12.233 に答える