vector如何釋放空間的問題

2021-06-16 10:58:38 字數 3828 閱讀 7732

#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...