3

ivar があるとしvector<type> myVector;ます。

このベクトルにアイテムを追加します。

後で、ベクターを何も「リセット」して、アイテムを再び新鮮なものに追加したいと思います。

次のことが正しいことを誰でも確認できますか。

myVector.clear(); //removes objects but does not remove memory occupied by prior full size of the vector, even though the vector is now empty with a size of 0

これら 2 つのサイトは互いに完全に矛盾していることに注意してください。この 1 つこのコンテナーに関連するすべてのイテレーター、ポインター、および参照が無効になっていることを示してclearいます。いずれにせよ、は変更されていないため、実際には が「リセット」されません。capacityvector

void someFunction(){
   vector<type> emptyVector;
   myVector.swap(emptyVector);
} // function terminates, thus the prior contents of myVector are deleted when emptyVector goes out of scope

これは最良のアプローチのように思われ、次と同じことを達成すると思います。

myVector.swap(vector<type>());

単純にこれを行うよりも、これがどのように良いか悪いか:

myVector=vector<type>();

これは単にシバン全体を新しい空のベクトルに設定するだけなので、メモリ内の古い場所は自動的に消去されますよね?

4

2 に答える 2

2
myVector=vector<type>();

のほとんどの実装はstd::vector上記をcopy-and-swapとして行います。これは、内部的にこれを行うことを意味します。

vector<type>().swap(*this); //inside the operator=

これはこれと同等です:

vector<type>().swap(myVector);

swap()ベクトルを空にするために必要なことを行うため、Soが推奨されます。余分な作業はありません。これは慣用的であり、最高の C++ コードでよく見られます。

一方operator=、 は、 を呼び出す以外に他のささいなことを行いswap()ます。したがって、swap()直接呼び出すと、いくつかの CPU サイクルが節約されます。

ご存じのように、容量をゼロにしたい(つまり、メモリの割り当てを解除しclear()たい) 場合は十分ではありません。


以下はコンパイルされないことに注意してください。

myVector.swap(vector<type>()); //compilation error

これはstd::vector::swap、一時オブジェクトがそれにバインドできないことを意味する非 const 参照によって引数を受け入れるためです。

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

于 2013-03-29T07:05:26.540 に答える
1

C++11 では vector::shrink_to_fit() が導入され、ベクターをそのサイズに物理的に縮小しようとします。ただし、そうすることが保証されているわけではありません。詳細については、ここを参照してください。

したがって、物理的にサイズを変更します。あなたは出来る:

myvector.clear();
myvector.shrink_to_fit();
于 2013-03-29T07:19:03.043 に答える