可以使用swap函數來釋放內存,就像下面提到的向量一樣?可以使用swap來清除std :: set作爲向量嗎?
std::vector<int> v1;
// somehow increase capacity
std::vector<int>().swap(v1);
可以使用swap函數來釋放內存,就像下面提到的向量一樣?可以使用swap來清除std :: set作爲向量嗎?
std::vector<int> v1;
// somehow increase capacity
std::vector<int>().swap(v1);
是的,它可以了,這一招可以讓你縮小你的載體的容量爲零:
std::vector<int> intVec;
intVec.reserve(100);
std::vector<int>().swap(intVec);
或
到元素的精確計數
std::vector<int> intVec;
intVec.reserve(100);
intVec.push_back(1);
std::cout << intVec.capacity() << std::endl; // prints 100
std::vector<int>(intVec).swap(intVec);
std::cout << intVec.capacity() << std::endl; // prints 1
更多關於看起來在這裏: http://www.gotw.ca/gotw/054.htm
關於'vector'的更好的信息,但問題是具體的技巧是否適用於'set'。 – 2017-07-26 09:07:45
大鼠如果你只是簡單地使用向量的方法clear()
或resize()
方法,很可能你的大小將被邏輯地修剪爲0,但分配的內存將保持在那裏以供重用。
如果你想要的是它實際上刪除多餘的內存,那麼你將交換空的矢量,它從來沒有分配它(雖然它可能會分配一些)。
如果設置已經分配了一些「節點」,並且決定保留它們以供重用,儘管一個集合沒有reserve()函數,這樣做也取決於實現者的STL是否釋放內存或保持它。
謝謝反正我會嘗試分配一組新的空集,並希望它工作在做這組免費 – Invictus 2012-01-12 20:36:39
swap
定義爲交換兩個向量的內容和容量。
set
在它的公共接口中沒有容量等任何東西,所以它沒有被定義爲交換容量,只是內容。沒有什麼特別的原因,爲什麼一套實現應該超出它所需要的過度分配。但是如果確實如此,那麼沒有標準的方法來確保「備用」內存被釋放,因爲它允許將備用內存保留在swap
的位置。
交換技巧對於set
可能不是很有用,因爲set
不太可能保持過剩容量。
另外,C++ 11會將一個shrink_to_fit()
成員添加到容器中,這很可能是有用的。所以只是使用它,如果它不可用,那麼不要擔心。
std :: set在哪裏? – Nobody 2012-01-12 18:36:30
我很困惑:你在說什麼'std :: set',爲什麼不'std :: set myset; myset.clear();'? –
karlphillip
2012-01-12 18:36:57
@沒有人認爲他想知道是否可以用'set'完成同樣的事情 – 2012-01-12 18:38:21