#include #include using namespace std;
templatevoid swap(vector&v2)
int main()
cout<<"swap: "cout<<"v2"cout<<"v3"<(v3).swap(v3);
cout<<"vector(v3).swap(v3): "<().swap(v3);
cout<<"vector().swap(v3): "<
執行:chen@chen-book1:~$ g++ vector_lian.cpp -o vector_lian
chen@chen-book1:~$ ./vector_lian
v1原始: 0
push 兩個元素: 2
reserve(100): 100
swap: 2
v2原始: 0
push 兩個元素: 2
reserve(100): 100
swap function: 2
v3原始: 0
push 兩個元素: 2
reserve(100): 100
vector(v3).swap(v3): 2
vector().swap(v3): 0
chen@chen-book1:~$
解釋:vector的拷貝建構函式和operator=函式只拷貝begin()到end()的部分,end()到start+end_of_storage部分不會拷貝;而swap函式是原樣拷貝,包括capacity部分都會考過來。
平時vector的空間是只增不減的,clear()函式只析構,不釋放空間。因此只能用swap函式來釋放了。swap之後臨時的那個vector應該釋放掉,方法是放在花括號中,放在函式中,或者最強大的——用臨時物件。並且,用他本身去初始化該臨時物件,於是,swap後,vector的容量就等於size,沒有多餘的空間。
參考:一、 std::vector 的容量操作
c++ stl 容器 vector 對於容量的操作是只增不減,如下面的**:
vectorv;
v.push_back(12); // capacity: 1
v.push_back(22);// capacity: 1 * 2 = 2
v.push_back(32);// capacity: 2 * 2 = 4
cout << v.capacity() << endl; // 4
v.insert(v.begin(), 12, 86);
cout << v.capacity() << endl; // 15
// 刪除第 3 個到倒手第 2 個元素(不含)之間的所有元素
v.erase(v.begin() + 2, v.end() 2);
cout << v.size() << endl; // size: 4
cout << v.capacity() << endl; // 15 < #1
v.clear();
cout << v.capacity() << endl; // 15 < #2
v.reserve(0);
cout << v.capacity() << endl; // 15 < #3
由上面的**可以看出,不論是刪除 vector 中的元素(#1)、甚至 clear 整個容器的內容(#2)、或顯式
將 capacity 保留為 0(#3),都無法縮減 vector 中閒置的空間。
二、 std::vector 複製構造不會複製 capacity
如下列**:
vectorv2;
v2.push_back(12);
v2.push_back(28);
cout << v2.capacity() << endl; // 2
v2.reserve(120);
cout << v2.capacity() << endl; // 120
cout << v2.size() << endl; // 2
vectorv3(v2);
cout << v3.capacity() << endl; // 2 < #1
cout << v3.size() << endl; // 2
如上所示,v3 的 capacity 只是 2(#2),即 v2 中的元素個數。
三、通過複製構造和 swap 來釋放 vector 容器閒置的記憶體空間
如下**:
vectorv2;
v2.push_back(12);
v2.push_back(28);
cout << v2.capacity() << endl; // 2
v2.reserve(120);
cout << v2.capacity() << endl; // 120
cout << v2.size() << endl; // 2
vector(v2).swap(v2); // < #1
cout << v2.capacity() << endl; // 2 < #2
為什麼可以縮減 v2 的 capacity?
1. vector(v2)呼叫 vector 的複製建構函式,用 v2 中的元素來構造乙個新的、臨時物件(無名
物件);
2. 由於是複製構造,所以新的、臨時物件的 capacity 是 v2 的元素的個數,所以為 2;
3. 由於成員函式 swap()交換兩個容器的一切:包括所有迭代器、size、所有元素甚至 capacity;
4. 經過 swap()後,v2 的 capacity 變成新的、臨時物件的 capacity,也即 2,對應的:臨時物件的
capacity 變成 120;
2 of 3
軒轅高階 it 培訓中心 www.xuanyuan-soft.cn
5. 由於 vector(v2)建立的臨時物件在 vector(v2).swap(v2);這個語句結束後銷毀,至此 v2
的 capacity 為 2,原先閒置的空間(120-2 個元素的空間)被釋放(隨著臨時容器物件的銷毀而釋
放)。同理,完全清除乙個 vector 的所有儲存:
vectorv2;
v2.push_back(12);
v2.push_back(28);
cout << v2.capacity() << endl; // 2
v2.reserve(120);
cout << v2.capacity() << endl; // 120
cout << v2.size() << endl; // 2
vector().swap(v2); // < #1
cout << v2.capacity() << endl; // < #2
1. #1 首先建立乙個臨時(空)容器,然後與 v2 進行 swap。
參考://reserve只增不減
void reserve(size_type n)
}//拷貝構造只拷貝有用元素
vector(const vector& x)
//賦值函式也只拷貝有用元素
template
vector& vector::operator=(const vector& x)
else if (size() >= x.size())
else
finish = start + x.size();
}return *this;
}//clear和erase不釋放空間,只是析構
void clear()
iterator erase(iterator first, iterator last)
MongoDB如何釋放空閒空間?
當我們從mongodb中刪除文件或集合時,mongodb並不會將已經占用了的磁碟空間釋放,它會一直維護已經占用了磁碟空間的資料檔案,儘管資料檔案中可能存在大大小小的空記錄列表 empty record list 當客戶端程式再次插入文件時,mongodb會從空記錄列表中分配儲存空間給新文件。那麼為了...
harbor刪除映象,釋放空間
harbor因為相同的標籤的映象重複提交次數過多導致,刪除映象後且gc清理後,磁碟空間沒有釋放。此檔案在harbor安裝目錄下,注釋下面部分,禁止身份驗證 auth token issuer harbor token issuer realm rootcertbundle etc registry ...
HBase 修改TTL 屬性釋放空間
1.停用相關表 hbase main 010 0 disable resourceurl 0 row s in 1383.2350 seconds 2.修改ttl屬性 hbase main 015 0 alter resourceurl updating all regions with the n...