2012-01-12 55 views
0

可以使用swap函數來釋放內存,就像下面提到的向量一樣?可以使用swap來清除std :: set作爲向量嗎?

 std::vector<int> v1; 

    // somehow increase capacity 

    std::vector<int>().swap(v1); 
+3

std :: set在哪裏? – Nobody 2012-01-12 18:36:30

+0

我很困惑:你在說什麼'std :: set',爲什麼不'std :: set myset; myset.clear();'? – karlphillip 2012-01-12 18:36:57

+1

@沒有人認爲他想知道是否可以用'set'完成同樣的事情 – 2012-01-12 18:38:21

回答

2

我不知道我理解你的問題,但你問是否有可能以相同的方式清空一套?

如果是這樣,那麼是的。 :)

+0

完全按照自己的理解jalf我的題目了是一樣..感謝了很多 – Invictus 2012-01-12 18:39:49

+0

希望使用帶有一套交換將釋放分配給該組的所有內存?我對嗎? – Invictus 2012-01-12 18:41:48

+0

@Ritesh是的,但調用clear()也會這樣做。沒有理由做交換。我想你可能會混淆調用'矢量 ::明確()'與調用'矢量 ::明確()'。 – 2012-01-12 18:52:09

2

是的,它可以了,這一招可以讓你縮小你的載體的容量爲零:

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

+0

關於'vector'的更好的信息,但問題是具體的技巧是否適用於'set'。 – 2017-07-26 09:07:45

2

大鼠如果你只是簡單地使用向量的方法clear()resize()方法,很可能你的大小將被邏輯地修剪爲0,但分配的內存將保持在那裏以供重用。

如果你想要的是它實際上刪除多餘的內存,那麼你將交換空的矢量,它從來沒有分配它(雖然它可能會分配一些)。

如果設置已經分配了一些「節點」,並且決定保留它們以供重用,儘管一個集合沒有reserve()函數,這樣做也取決於實現者的STL是否釋放內存或保持它。

+0

謝謝反正我會嘗試分配一組新的空集,並希望它工作在做這組免費 – Invictus 2012-01-12 20:36:39

3

swap定義爲交換兩個向量的內容和容量

set在它的公共接口中沒有容量等任何東西,所以它沒有被定義爲交換容量,只是內容。沒有什麼特別的原因,爲什麼一套實現應該超出它所需要的過度分配。但是如果確實如此,那麼沒有標準的方法來確保「備用」內存被釋放,因爲它允許將備用內存保留在swap的位置。

+0

我的設置是全局定義的,所以我只是想爲它後持有大量elemnets的釋放內存的斤斤計較的記憶裏,與它一起工作就完成了。所以,即使它沒有備用內存,我只是想在工作完成後釋放它的內存。所以我想換是我離開 – Invictus 2012-01-12 20:32:04

+0

@Ritesh我唯一的選擇:沒有,互換是完全沒有意義的。它不會有任何備用內存。只需調用'clear()'就可以了。 – 2012-01-12 20:35:16

+0

非常感謝,但你確定清楚會釋放內存以供重用嗎? – Invictus 2012-01-12 20:38:52

1

交換技巧對於set可能不是很有用,因爲set不太可能保持過剩容量。

另外,C++ 11會將一個shrink_to_fit()成員添加到容器中,這很可能是有用的。所以只是使用它,如果它不可用,那麼不要擔心。

相關問題