假設有若干物件存於乙個 vector 中:
classwidget;
vector
vw;
後來由於某些原因,從該容器中刪除了若干物件(參考erase-remove idiom )。對於 vector 和 string 來講, erase() 和 clear() 並不會改變容器的capacity,也就不會改變他們的記憶體占用。
swap() 本意是用來交換兩個容器的內容( iterators, pointers, and references),但我們可以用他來快速將容器的 capacity 調整為合適的大小:
vector(vw).swap(vw);
巧妙之處在於, vector 的拷貝建構函式僅僅拷貝有用的部分而忽略那些未占用的空間,用這個拷貝構造出來的容器來和 vw 進行 swap() 就可以調整 vw 的 capacity 為乙個相對較小的值。
這裡之所以說是相對較小的值而不是與 size() 絕對相等,是因為容器的 implementation 在構造的時候會自己選取合適的值來保證分配的空間足夠容納所有的元素,但這個值可能會比 size() 大, 可參考item 14 。
下面是乙個簡單的例子,對 vector 進行一些操作,然後輸出其 erase, swap,clear 之後的 size 與 capacity:
#include#include
#include
#include
#include
#include
using
namespace
std;
const
intmax = 1024;
#define
show(v, msg) printf ("%s -- %s: size: %lu, capacity: %lu\n", \
#v, msg, v.size(), v.capacity());
intmain(int
argc, char *argv)
show(v, "after filling");
v.erase(remove_if(v.begin(), v.end(), (int
x)), v.end());
show(v, "after erase()");
vector
(v).swap(v);
show(v, "after swap()");
v.clear();
show(v, "after clear");
vector
().swap(v);
show(v, "after swap with empty vector");
return 0;
}
其輸出如下:
testing vector...v -- after init: size: 0, capacity: 0
v -- after reserve(): size: 0, capacity: 1024
v -- after filling: size: 1024, capacity: 1024
v -- after erase(): size: 106, capacity: 1024
v -- after swap(): size: 106, capacity: 106
v -- after clear: size: 0, capacity: 106
v -- after swap with empty vector: size: 0, capacity: 0
program ended with exit code: 0
vector記憶體清理情況 clear和swap
光clear是不釋放記憶體的,將你這段 修改了一下,你看看,應該能明白了,不明白執行一下就知道了。include include using namespace std main cout 未放元素時容器大小為 it.size 容器容量為 it.capacity endl 未放元素 for int ...
vector的clear操作的內部過程
最近在論壇看到乙個提問帖子,問題是vector中儲存了物件的指標,呼叫clear後這些指標如何刪除?class test test int main 同時最近又看到一道面試題 對於stl中的vector呼叫clear時,內部是如何操作的?若想將其記憶體釋放,該如何操作?針對以上兩個問題,我們追蹤一下...
vector的clear操作的內部過程
在使用clear時遇到了一些問題,看到網上的資料,寫的很不錯 我也學習到很多。要注意vector儲存指標的問題。最終還是要使用delete依次釋放才行。最近在論壇看到乙個提問帖子,問題是vector中儲存了物件的指標,呼叫clear後這些指標如何刪除?cpp view plain copy clas...