C vector swap 去除多餘容量

2021-10-14 02:51:46 字數 3644 閱讀 7902

今天在查詢swap()函式的時候,發現了swap()函式居然可以用來減少vector容器的大小,

眾所周知,vector的容器的大小只可以增加,不可以減少。當我們使用push_back(),insert(),emplace()

等成員方法的時候,有可能會增加容量,但是我們使用 pop_back()、erase()、clear() 等方式的時候,並不會減少實際 的記憶體容量。只是可以刪除容器裡面的內容。

#include

#include

using namespace std;

int main()

cout << "2、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;

//手動為 myvector 擴容

myvector.reserve(1000);

cout << "3、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;

myvector.erase(myvector.begin());

cout << "4、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;

myvector.pop_back();

cout << "5、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;

myvector.clear();

cout << "6、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;

return 0;

}

結果為:

1、當前 myvector 擁有 0 個元素,容量為 0

2、當前 myvector 擁有 10 個元素,容量為 13

3、當前 myvector 擁有 10 個元素,容量為 1000

4、當前 myvector 擁有 9 個元素,容量為 1000

5、當前 myvector 擁有 8 個元素,容量為 1000

6、當前 myvector 擁有 0 個元素,容量為 1000

顯然,myvector 容器儲存的元素個數在減少,但容量並不會減小。

幸運的是,myvector 模板類中提供有乙個 shrink_to_fit() 成員方法,該方法的功能是將當前 vector 容器的容量縮減至和實際儲存元素的個數相等。例如,在程式一的基礎上,新增如下語句:

myvector.shrink_to_fit();

cout << "7、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;

7、當前 myvector 擁有 10 個元素,容量為 10
除此之外,可以利用swap()方法進行出去vector多餘的容量,

swap()的原型

template void swap (t& a, t& b)

template void swap (t &a[n], t &b[n])

所以,swap()函式,本質是進行右值移動。

所以,想要用swap()進行去除多餘的容量是,這麼回事勒?

vector(x).swap(x);
期中,x是當前要操作的容器,t是容器的型別。

#include

#include

using namespace std;

int main()

//將 myvector 容量縮減至 10

vector(myvector).swap(myvector);

cout << "2、當前 myvector 擁有 " << myvector.size() << " 個元素,容量為 " << myvector.capacity() << endl;

return 0;

}

程式的結果為:

1、當前 myvector 擁有 0 個元素,容量為 1000

2、當前 myvector 擁有 10 個元素,容量為 10

這個**可以分成3部走,

(1)先執行 vector(myvector),此表示式會呼叫 vector 模板類中的拷貝建構函式,從而建立出乙個臨時的 vector 容器(後續稱其為 tempvector)。值得一提的是,tempvector 臨時容器並不為空,因為我們將 myvector 作為引數傳遞給了複製建構函式,該函式會將 myvector 容器中的所有元素拷貝乙份,並儲存到 tempvector 臨時容器中。但是,vector 模板類中的拷貝建構函式只會為拷貝的元素分配儲存空間。換句話說,tempvector 臨時容器中沒有空閒的儲存空間,其容量等於儲存元素的個數

(2)然後借助swap() 成員方法對 tempvector 臨時容器和 myvector 容器進行調換,此過程不僅會交換 2 個容器儲存的元素,還會交換它們的容量。換句話說經過 swap() 操作,myvetor 容器具有了 tempvector 臨時容器儲存的所有元素和容量,同時 tempvector 也具有了原 myvector 容器儲存的所有元素和容量。

(3) 當整條語句執行結束時,臨時的 tempvector 容器會被銷毀,其佔據的儲存空間都會被釋放。注意,這裡釋放的其實是原 myvector 容器占用的儲存空間。

利用swap()方法清空vector容器

當 swap() 成員方法用於清空 vector 容器時,可以套用如下的語法格式:

vector().swap(x);
和上面語法格式唯一的不同之處在於,這裡沒有為 vector() 表示式傳遞任何引數。這意味著,此表示式將呼叫 vector 模板類的預設建構函式,而不再是複製建構函式。也就是說,此格式會先生成乙個空的 vector 容器,再借助 swap() 方法將空容器交換給 x,從而達到清空 x 的目的。

C vector swap 去除多餘容量

今天在查詢swap 函式的時候,發現了swap 函式居然可以用來減少vector容器的大小,眾所周知,vector的容器的大小只可以增加,不可以減少。當我們使用push back insert emplace 等成員方法的時候,有可能會增加容量,但是我們使用 pop back erase clear...

去除多餘元素

5.統計試卷名稱為 鷹牌 東鵬瓷磚8月活動方案試卷 的考試情況.輸出以下資訊 考試者 真實姓名 正確率 交卷時間,以 的形式輸出.如出現多次作答情況 姓名相同 取最高分 如正確率低於80,以紅色字型輸出 資料表 yjt ksjg erp表單 合作夥伴 考試結果 date get select arr...

JS去除多餘空格

trim str,pos 該方法可以去除空格,分別可以去除所有空格,兩端空格,左邊空格,右邊空格,預設為去除兩端空格 str 字串 pos 去除那些位置的空格,可選為 both 預設值,去除兩端空格,left 去除左邊空格,right 去除右邊空格,all 去除包括中間和兩端的所有空格 export...