亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++之std::vector刪除元素的幾種方式及區(qū)別說明

 更新時間:2023年08月07日 11:10:12   作者:休息一下接著來  
這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

容器vector在刪除過程中,常用的函數(shù)。

函數(shù)作用
pop_back()刪除 vector 容器中最后一個元素,該容器的大?。╯ize)會減 1,但容量(capacity)不會發(fā)生改變。
erase(iter)刪除 vector 容器中iter迭代器指定位置處的元素,并返回指向被刪除元素下一個位置元素的迭代器。該容器的大?。╯ize)會減 1,但容量(capacity)不會發(fā)生改變。
erase(iter1,iter2)刪除 vector 容器中位于迭代器 [iter1,iter2)指定區(qū)域內的所有元素,并返回指向被刪除區(qū)域下一個位置元素的迭代器。該容器的大?。╯ize)會減小,但容量(capacity)不會發(fā)生改變。
clear()刪除 vector 容器中所有的元素,使其變成空的 vector 容器。該函數(shù)會改變 vector 的大?。ㄗ?yōu)?0),但不是改變其容量。
remove(iter1,iter2,key)刪除容器中所有和指定元素值相等的元素,并返回指向最后一個元素下一個位置的迭代器。值得一提的是,調用該函數(shù)不會改變容器的大小和容量。(后面會詳細說明,該函數(shù)的用法)
swap(vector)用于交換向量的內容,用一個向量調用它并接受另一個向量作為參數(shù)并交換它們的內容。 (兩個向量的大小可能不同)。通過交換向量進行刪除。
shrink_to_fit()將vector 容器的容量縮減至和實際存儲元素的個數(shù)相等??梢耘浜弦陨系暮瘮?shù),收回內存

注意:

  • 容器的大小size:容器實際存放元素的數(shù)量。
  • 容器的容量capacity:容器在內存中開辟空間的容量(在不開辟新的空間時,能存放數(shù)據(jù)的大?。?/li>

1. 使用earse和remove配合刪除容器中指定值的元素

remove函數(shù)本質上其實并沒有完成元素的完全刪除工作,因為容器的大小都沒有改變,它只是將所有被刪除的元素用下一個不被刪除的元素進行覆蓋,同時返回一個迭代器,在該迭代器之前的所有元素,保留原容器的順序,并且不存在被刪除的元素,也就是你想要的容器內容,而該迭代器到容器的末尾則不變,也就是說,原容器的大小沒有發(fā)生變化,被刪除的元素也確實沒有了,但容器末尾的一些元素(個數(shù)等于被刪除元素個數(shù))又會多出來一份,這是我們不愿意看到的,因此需要借助上面提到的erase函數(shù)。所以說remove需要和erase搭配使用才能實現(xiàn)完整的刪除功能。

單獨使用remove

#include <iostream>
#include <vector>
#include <algorithm>			// [注意] :remove位于algorithm函數(shù)庫中
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};
    std::cout << vecInt.size() << std::endl;     // 輸出的結果為5,容器中存了5個元素
    std::cout << vecInt.capacity() << std::endl; // 輸出的結果為5,容器在內存開辟空間的容量
    std::remove(vecInt.begin(), vecInt.end(),3);
    std::cout << vecInt.size() << std::endl;     // 輸出的結果為5,容器中存了5個元素
    std::cout << vecInt.capacity() << std::endl; // 輸出的結果為5,容器在內存開辟空間的容量
    for(auto i : vecInt)
    {
        std::cout << i << std::endl;
    }
}
// 使用remove之前,容器vector的值為: 0,1,2,3,4
// 使用remove函數(shù)刪除值為3的元素后,容器vector的值為:0,1,2,4,4
// 可以看出remove,沒有改變容器的size,只是將值為3的元素刪除后,將后面的元素,移動到前面(后面的值還保留,因此最后是4)。

earse和remove配和使用

#include <iostream>
#include <vector>
#include <algorithm>		// [注意] :remove位于algorithm函數(shù)庫中
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};
    std::cout << vecInt.size() << std::endl;     // 輸出的結果為5,容器中存了5個元素
    std::cout << vecInt.capacity() << std::endl; // 輸出的結果為5,容器在內存開辟空間的容量
    vecInt.erase(std::remove(vecInt.begin(), vecInt.end(), 3), vecInt.end());
    std::cout << vecInt.size() << std::endl;     // 輸出的結果為4,容器中存了4個元素
    std::cout << vecInt.capacity() << std::endl; // 輸出的結果為5,容器在內存開辟空間的容量
    for(auto i : vecInt)
    {
        std::cout << i << std::endl;
    }
}
// 使用remove之前,容器vector的值為: 0,1,2,3,4
// 使用remove函數(shù)刪除值為3的元素后,容器vector的值為:0,1,2,4,
// 可以看出remove,容器的size變成了size-1,刪除了值為3的元素。容器的capacity不變

注意:

  • remove位于algorithm函數(shù)庫中,使用時需要調用algorithm頭文件。
  • earse和remove不改變vector的容量capacity,(不會收回容器在內存中開辟的空間)

2. 使用swap刪除容器的所有元素,并收回內存

使用clear清空容器中的元素

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};
    std::cout << vecInt.size() << std::endl;     //  輸出的結果為5,容器中存了5個元素
    std::cout << vecInt.capacity() << std::endl; // 輸出的結果為5,容器在內存開辟空間的容量
    vecInt.clear();					// 使用clear清空容器
    std::cout << vecInt.size() << std::endl;     // 輸出的結果為0,容器中存了0個元素
    std::cout << vecInt.capacity() << std::endl; // 輸出的結果為5,容器在內存開辟空間的容量
}

可以看出使用clean可以清空vector,但是不會改變capacity,(不會收回容器在內存中開辟的空間)。

使用swap清空容器中的元素

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt{0, 1, 2, 3, 4};
    std::cout << vecInt.size() << std::endl;      //  輸出的結果為5,容器中存了5個元素
    std::cout << vecInt.capacity() << std::endl;  //  輸出的結果為5,容器在內存開辟空間的容量
    std::vector<int>().swap(vecInt);		// 使用swap函數(shù),將容器與空的容器交換,從而刪除容器數(shù)據(jù),并且收回內存
    std::cout << vecInt.size() << std::endl;     // 輸出的結果為0,容器中存了0個元素
    std::cout << vecInt.capacity() << std::endl; // 輸出的結果為0,容器在內存開辟空間的容量
}

使用swap函數(shù),將容器與空的容器交換,從而刪除容器所有數(shù)據(jù),并且收回內存。

注意:

這里沒有為 std::vector() 表達式傳遞任何參數(shù)。

這意味著,此表達式將調用 vector 模板類的默認構造函數(shù),而不再是復制構造函數(shù)。

也就是說,此格式會先生成一個空的 vector 容器,再借助 swap() 方法將空容器交換給 vecInt,從而達到清空 vecInt 的目的。

3. 使用shrink_to_fit()配合其他函數(shù),刪除元素并回收內存

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt{0, 1, 2, 3, 4};
    vecInt.pop_back(); 				// 刪除容器中的最后一個元素
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的數(shù)量為4
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量為5。
    vecInt.shrink_to_fit();				//  將vector 容器的容量縮減至和實際存儲元素的個數(shù)相等
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的數(shù)量為4
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量為4。
    vecInt.clear();				//清空容器
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的數(shù)量為0
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量為4。
    vecInt.shrink_to_fit();			//  將vector 容器的容量縮減至和實際存儲元素的個數(shù)相等
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的數(shù)量為0
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量為0。
}

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C語言的動態(tài)內存管理你了解嗎

    C語言的動態(tài)內存管理你了解嗎

    這篇文章主要為大家詳細介紹了C語言的動態(tài)內存管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言冷知識之預處理字符串操作符詳解

    C語言冷知識之預處理字符串操作符詳解

    當年學習C語言的第一門課就提到過標記(Token)的概念,不過,相信在多年之后你再次聽到這個術語時會一臉懵逼,比如我。因此特地翻了翻資料,整理下來這些筆記,希望對大家有所幫助
    2022-11-11
  • Opengl?ES之FBO幀緩沖對象使用詳解

    Opengl?ES之FBO幀緩沖對象使用詳解

    這篇文章主要為大家介紹了Opengl?ES之FBO幀緩沖對象使用詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • VC++實現(xiàn)添加文件關聯(lián)的方法示例

    VC++實現(xiàn)添加文件關聯(lián)的方法示例

    這篇文章主要介紹了VC++實現(xiàn)添加文件關聯(lián)的方法,涉及VC++針對注冊表的寫入與VC事件響應相關操作技巧,需要的朋友可以參考下
    2017-08-08
  • C語言實現(xiàn)停車場管理

    C語言實現(xiàn)停車場管理

    這篇文章主要為大家詳細介紹了C語言課程設計之停車場管理問題,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言中-a++和-++a運算順序實例解析

    C語言中-a++和-++a運算順序實例解析

    C語言中的a++和++a的區(qū)別在于混合表達式中運算符的處理順序,下面這篇文章主要給大家介紹了關于C語言中-a++和-++a運算順序的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Qt多線程實現(xiàn)網(wǎng)絡發(fā)送文件功能

    Qt多線程實現(xiàn)網(wǎng)絡發(fā)送文件功能

    這篇文章主要為大家詳細介紹了Qt多線程實現(xiàn)網(wǎng)絡發(fā)送文件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Visual?Studio?2022編譯C++20代碼

    Visual?Studio?2022編譯C++20代碼

    本文主要介紹了Visual?Studio?2022編譯C++20代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 利用c語言實現(xiàn)卷積碼編碼器示例

    利用c語言實現(xiàn)卷積碼編碼器示例

    這篇文章主要介紹了利用c語言實現(xiàn)卷積碼編碼器示例,需要的朋友可以參考下
    2014-03-03
  • C++日期與時間 chrono庫介紹及使用教程

    C++日期與時間 chrono庫介紹及使用教程

    chrono庫是C++11中的一個標準庫,它提供了一系列與時間相關的類和函數(shù),用于表示和處理時間間隔,時鐘和時間點,C++20新增Calendar,這篇文章主要介紹了C++日期與時間 chrono庫介紹及使用,需要的朋友可以參考下
    2023-12-12

最新評論