C++之std::vector刪除元素的幾種方式及區(qū)別說明
容器vector在刪除過程中,常用的函數(shù)。
| 函數(shù) | 作用 |
|---|---|
| pop_back() | 刪除 vector 容器中最后一個元素,該容器的大小(size)會減 1,但容量(capacity)不會發(fā)生改變。 |
| erase(iter) | 刪除 vector 容器中iter迭代器指定位置處的元素,并返回指向被刪除元素下一個位置元素的迭代器。該容器的大?。╯ize)會減 1,但容量(capacity)不會發(fā)生改變。 |
| erase(iter1,iter2) | 刪除 vector 容器中位于迭代器 [iter1,iter2)指定區(qū)域內(nèi)的所有元素,并返回指向被刪除區(qū)域下一個位置元素的迭代器。該容器的大?。╯ize)會減小,但容量(capacity)不會發(fā)生改變。 |
| clear() | 刪除 vector 容器中所有的元素,使其變成空的 vector 容器。該函數(shù)會改變 vector 的大小(變?yōu)?0),但不是改變其容量。 |
| remove(iter1,iter2,key) | 刪除容器中所有和指定元素值相等的元素,并返回指向最后一個元素下一個位置的迭代器。值得一提的是,調(diào)用該函數(shù)不會改變?nèi)萜鞯拇笮『腿萘?。(后面會詳細說明,該函數(shù)的用法) |
| swap(vector) | 用于交換向量的內(nèi)容,用一個向量調(diào)用它并接受另一個向量作為參數(shù)并交換它們的內(nèi)容。 (兩個向量的大小可能不同)。通過交換向量進行刪除。 |
| shrink_to_fit() | 將vector 容器的容量縮減至和實際存儲元素的個數(shù)相等??梢耘浜弦陨系暮瘮?shù),收回內(nèi)存 |
注意:
- 容器的大小size:容器實際存放元素的數(shù)量。
- 容器的容量capacity:容器在內(nèi)存中開辟空間的容量(在不開辟新的空間時,能存放數(shù)據(jù)的大?。?/li>
1. 使用earse和remove配合刪除容器中指定值的元素
remove函數(shù)本質(zhì)上其實并沒有完成元素的完全刪除工作,因為容器的大小都沒有改變,它只是將所有被刪除的元素用下一個不被刪除的元素進行覆蓋,同時返回一個迭代器,在該迭代器之前的所有元素,保留原容器的順序,并且不存在被刪除的元素,也就是你想要的容器內(nèi)容,而該迭代器到容器的末尾則不變,也就是說,原容器的大小沒有發(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; // 輸出的結(jié)果為5,容器中存了5個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為5,容器在內(nèi)存開辟空間的容量
std::remove(vecInt.begin(), vecInt.end(),3);
std::cout << vecInt.size() << std::endl; // 輸出的結(jié)果為5,容器中存了5個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為5,容器在內(nèi)存開辟空間的容量
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,沒有改變?nèi)萜鞯膕ize,只是將值為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; // 輸出的結(jié)果為5,容器中存了5個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為5,容器在內(nèi)存開辟空間的容量
vecInt.erase(std::remove(vecInt.begin(), vecInt.end(), 3), vecInt.end());
std::cout << vecInt.size() << std::endl; // 輸出的結(jié)果為4,容器中存了4個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為5,容器在內(nèi)存開辟空間的容量
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ù)庫中,使用時需要調(diào)用algorithm頭文件。
- earse和remove不改變vector的容量capacity,(不會收回容器在內(nèi)存中開辟的空間)
2. 使用swap刪除容器的所有元素,并收回內(nèi)存
使用clear清空容器中的元素
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecInt{0, 1 , 2 ,3 ,4};
std::cout << vecInt.size() << std::endl; // 輸出的結(jié)果為5,容器中存了5個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為5,容器在內(nèi)存開辟空間的容量
vecInt.clear(); // 使用clear清空容器
std::cout << vecInt.size() << std::endl; // 輸出的結(jié)果為0,容器中存了0個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為5,容器在內(nèi)存開辟空間的容量
}可以看出使用clean可以清空vector,但是不會改變capacity,(不會收回容器在內(nèi)存中開辟的空間)。
使用swap清空容器中的元素
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecInt{0, 1, 2, 3, 4};
std::cout << vecInt.size() << std::endl; // 輸出的結(jié)果為5,容器中存了5個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為5,容器在內(nèi)存開辟空間的容量
std::vector<int>().swap(vecInt); // 使用swap函數(shù),將容器與空的容器交換,從而刪除容器數(shù)據(jù),并且收回內(nèi)存
std::cout << vecInt.size() << std::endl; // 輸出的結(jié)果為0,容器中存了0個元素
std::cout << vecInt.capacity() << std::endl; // 輸出的結(jié)果為0,容器在內(nèi)存開辟空間的容量
}使用swap函數(shù),將容器與空的容器交換,從而刪除容器所有數(shù)據(jù),并且收回內(nèi)存。
注意:
這里沒有為 std::vector() 表達式傳遞任何參數(shù)。
這意味著,此表達式將調(diào)用 vector 模板類的默認構(gòu)造函數(shù),而不再是復(fù)制構(gòu)造函數(shù)。
也就是說,此格式會先生成一個空的 vector 容器,再借助 swap() 方法將空容器交換給 vecInt,從而達到清空 vecInt 的目的。
3. 使用shrink_to_fit()配合其他函數(shù),刪除元素并回收內(nèi)存
#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。
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言用指針函數(shù)尋找數(shù)組中的最大值與次大值
這篇文章主要給大家介紹了關(guān)于C語言用指針函數(shù)尋找數(shù)組中的最大值與次大值的相關(guān)資料,該代碼通過定義一個名為LargestTow的函數(shù)來找出數(shù)組中的最大值和次大值,并將結(jié)果分別存入指針所指向的內(nèi)存單元中,需要的朋友可以參考下2024-11-11
詳解C++中的指針結(jié)構(gòu)體數(shù)組以及指向結(jié)構(gòu)體變量的指針
這篇文章主要介紹了C++中的指針結(jié)構(gòu)體數(shù)組以及指向結(jié)構(gòu)體變量的指針的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
探討編寫int strlen(char *strDest);不允許定義變量的問題
本篇文章是對編寫int strlen(char *strDest);不允許定義變量的問題進行了詳細的分析介紹,需要的朋友參考下2013-05-05

