C++中remove與erase區(qū)別小結(jié)
vector中, remove函數(shù)和 erase函數(shù)都可以實(shí)現(xiàn)元素的刪除,但它們的用法稍微有些區(qū)別:
- erase是刪除指定位置的元素或者指定區(qū)域內(nèi)的所有元素
- remove是刪除和指定元素值相同的所有元素(remove需要和erase搭配使用才能實(shí)現(xiàn)完整的刪除功能)
erase
erase用于從一個(gè)集合中刪除一個(gè)元素,但是對(duì)于基于數(shù)組的容器,如vector,存儲(chǔ)在被刪除元素后的所有元素都需要向前移動(dòng)以避免集合中有一個(gè)空位(gap),在同一容器中多次調(diào)用產(chǎn)生了大量移動(dòng)元素的開銷。并且使用erase之后,后面元素的迭代器都會(huì)失效,例如:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main() {
vector<int> vec = { 1,2,3,4,5,6,7 };
vector<int>::iterator itr = vec.begin();
for(auto itr=vec.begin();itr!=vec.end();++itr) {
if (*itr %2 == 1) {
vec.erase(itr);
}
}
for(auto it=vec.begin();it!=vec.end();++it){
cout<<*it<<" ";
}
return 0;
}

這樣的代碼時(shí)無(wú)法編譯成功的,因?yàn)樵趀rase以后,之后所有的迭代器都失效了,此時(shí)會(huì)返回一個(gè)新的迭代器,我們可以對(duì)代碼進(jìn)行如下修改:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main() {
vector<int> vec = { 1,2,3,4,5,6,7 };
vector<int>::iterator itr = vec.begin();
while (itr != vec.end()) {
if (*itr %2 == 1) {
itr=vec.erase(itr);
}else{
++itr;
}
}
for(auto it=vec.begin();it!=vec.end();++it){
cout<<*it<<" ";
}
return 0;
}

滿足條件的就利用返回的新的迭代器,不滿足條件的直接++;
remove
他們存在于algorithm庫(kù),由于這些算法運(yùn)行在兩個(gè)前向迭代器確定的元素范圍上,它們沒有底層容器或集合的具體知識(shí)。并不從容器刪除元素,而是把不符合刪除標(biāo)準(zhǔn)的元素搬移到容器的尾部,并保持這些元素的相對(duì)次序,返回指向最后一個(gè)元素下一個(gè)位置的迭代器。 該算法一次通過數(shù)據(jù)范圍即可實(shí)現(xiàn)該目標(biāo)。由于沒有元素被刪除,因此不會(huì)改變?nèi)萜鞯拇笮『腿萘?。容器尾部的元素都是需要被刪除的,一般remove需要和erase搭配使用才能實(shí)現(xiàn)完整的刪除功能。
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec{ 1,3,3,4,3,5 };
auto iter = std::remove(vec.begin(), vec.end(), 3);
cout << "size is :" << vec.size() << endl;
cout << "capacity is :" << vec.capacity() << endl;
//輸出迭代器之前的元素
for (auto first = vec.begin(); first < iter;++first) {
cout << *first << " ";
}
cout<<endl;
//輸出vec剩余的元素
for (auto it = vec.begin(); it != vec.end();++it) {
cout << *it << " ";
}
return 0;
}

- remove() 的實(shí)現(xiàn)原理是,在遍歷容器中的元素時(shí),一旦遇到目標(biāo)元素,就做上標(biāo)記,然后繼續(xù)遍歷,直到找到一個(gè)非目標(biāo)元素,即用此元素將最先做標(biāo)記的位置覆蓋掉,同時(shí)將此非目標(biāo)元素所在的位置也做上標(biāo)記,等待找到新的非目標(biāo)元素將其覆蓋。因此,如果將上面程序中 demo 容器的元素全部輸出,得到的結(jié)果為 1 4 5 4 3 5。
- 通過remove()并沒有把這些值真正的刪除,需要配合erase來(lái)完成刪除操作:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec{ 1,3,3,4,3,5 };
auto iter = std::remove(vec.begin(), vec.end(), 3);
cout << "原 size is :" << vec.size() << endl;
cout << "原 capacity is :" << vec.capacity() << endl;
vec.erase(iter,vec.end());
cout << "刪除后 size is :" << vec.size() << endl;
cout << "刪除后 capacity is :" << vec.capacity() << endl;
//輸出迭代器之前的元素
for (auto first = vec.begin(); first < iter;++first) {
cout << *first << " ";
}
cout<<endl;
//輸出vec剩余的元素
for (auto it = vec.begin(); it != vec.end();++it) {
cout << *it << " ";
}
return 0;
}

也可以合并進(jìn)行刪除:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec{ 1,3,3,4,3,5 };
vec.erase(remove(vec.begin(),vec.end(),3),vec.end());
cout << "刪除后 size is :" << vec.size() << endl;
cout << "刪除后 capacity is :" << vec.capacity() << endl;
//輸出vec剩余的元素
for (auto it = vec.begin(); it != vec.end();++it) {
cout << *it << " ";
}
return 0;
}

補(bǔ)充刪除 vector 容器元素的幾種方式

到此這篇關(guān)于C++中remove與erase區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)C++ remove erase 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ const限定符以及頂層const和底層const的案例詳解
這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Qt?加載?libjpeg?庫(kù)出現(xiàn)“長(zhǎng)跳轉(zhuǎn)已經(jīng)運(yùn)行”錯(cuò)誤問題解決
這篇文章主要介紹了Qt?加載?libjpeg?庫(kù)出現(xiàn)“長(zhǎng)跳轉(zhuǎn)已經(jīng)運(yùn)行”錯(cuò)誤,本文給大家分享完美解決方案,需要的朋友可以參考下2023-04-04
C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門及對(duì)比
這篇文章主要介紹了C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門及對(duì)比,同時(shí)二者在C++中的使用情況也基本上同理,是需要的朋友可以參考下2015-12-12
C語(yǔ)言實(shí)現(xiàn)學(xué)生獎(jiǎng)學(xué)金評(píng)定系統(tǒng)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生獎(jiǎng)學(xué)金評(píng)定系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表
這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04

