最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中remove與erase區(qū)別小結(jié)

 更新時(shí)間:2024年08月20日 11:25:01   作者:吃我一個(gè)平底鍋  
remove函數(shù)和 erase函數(shù)都可以實(shí)現(xiàn)元素的刪除,本文主要介紹了C++中remove與erase區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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)元素的開(kāi)銷(xiāo)。并且使用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;
}

在這里插入圖片描述

滿(mǎn)足條件的就利用返回的新的迭代器,不滿(mǎn)足條件的直接++;

remove

他們存在于algorithm庫(kù),由于這些算法運(yùn)行在兩個(gè)前向迭代器確定的元素范圍上,它們沒(méi)有底層容器或集合的具體知識(shí)。并不從容器刪除元素,而是把不符合刪除標(biāo)準(zhǔn)的元素搬移到容器的尾部,并保持這些元素的相對(duì)次序,返回指向最后一個(gè)元素下一個(gè)位置的迭代器。 該算法一次通過(guò)數(shù)據(jù)范圍即可實(shí)現(xiàn)該目標(biāo)。由于沒(méi)有元素被刪除,因此不會(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。
  • 通過(guò)remove()并沒(méi)有把這些值真正的刪除,需要配合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語(yǔ)言中結(jié)構(gòu)體的使用

    詳解C語(yǔ)言中結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一些值的集合,這些值稱(chēng)為成員變量,結(jié)構(gòu)體的每個(gè)成員可以是不同類(lèi)型的變量。本文將通過(guò)示例為大家詳細(xì)講講C語(yǔ)言中結(jié)構(gòu)體的使用,需要的可以參考一下
    2022-07-07
  • 二叉查找樹(shù)的插入,刪除,查找

    二叉查找樹(shù)的插入,刪除,查找

    以下是對(duì)二叉查找樹(shù)的插入與刪除以及查找進(jìn)行了詳細(xì)的介紹,需要的朋友可以 過(guò)來(lái)參考下
    2013-09-09
  • 利用C語(yǔ)言實(shí)現(xiàn)順序表的實(shí)例操作

    利用C語(yǔ)言實(shí)現(xiàn)順序表的實(shí)例操作

    順序表是線(xiàn)性表中的一種重要的數(shù)據(jù)結(jié)構(gòu),也是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),所以他不僅是學(xué)習(xí)中的重點(diǎn),也是應(yīng)用開(kāi)發(fā)非常常用的一種數(shù)據(jù)結(jié)構(gòu)。這篇文章介紹如何利用C語(yǔ)言實(shí)現(xiàn)順序表。
    2016-08-08
  • 使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例

    使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例

    這篇文章主要為大家介紹了使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • C++實(shí)現(xiàn)八皇后問(wèn)題的方法

    C++實(shí)現(xiàn)八皇后問(wèn)題的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)八皇后問(wèn)題的方法,是數(shù)據(jù)結(jié)構(gòu)與算法中常見(jiàn)的一個(gè)經(jīng)典算法,需要的朋友可以參考下
    2014-09-09
  • 黑客帝國(guó)數(shù)字雨效果VC6源代碼分享

    黑客帝國(guó)數(shù)字雨效果VC6源代碼分享

    這篇文章主要介紹了黑客帝國(guó)數(shù)字雨效果VC6源代碼分享,本文直接給出實(shí)現(xiàn)代碼,Win7下編譯通過(guò),效果很酷,需要的朋友可以參考下
    2015-02-02
  • C語(yǔ)言中各種運(yùn)算類(lèi)型全面總結(jié)

    C語(yǔ)言中各種運(yùn)算類(lèi)型全面總結(jié)

    C語(yǔ)言運(yùn)算符是說(shuō)明特定操作的符號(hào),它是構(gòu)造C語(yǔ)言表達(dá)式的工具,C語(yǔ)言的運(yùn)算異常豐富,除了控制語(yǔ)句和輸入輸出以外的幾乎所有的基本操作都為運(yùn)算符處理
    2022-04-04
  • C++命名空間實(shí)例詳解

    C++命名空間實(shí)例詳解

    這篇文章主要介紹了C++命名空間實(shí)例詳解,有感興趣的同學(xué)可以研究下
    2021-02-02
  • C++的繼承和派生你了解嗎

    C++的繼承和派生你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++繼承和派生,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • vs2022?x64?C/C++和匯編混編(案例代碼)

    vs2022?x64?C/C++和匯編混編(案例代碼)

    這篇文章主要介紹了vs2022?x64?C/C++和匯編混編,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

双辽市| 凤冈县| 通化市| 龙泉市| 长汀县| 威海市| 仪征市| 荥阳市| 娄底市| 汕头市| 青岛市| 广汉市| 平江县| 盖州市| 富阳市| 四平市| 荣昌县| 新田县| 长春市| 仁寿县| 沂南县| 吉水县| 高邮市| 哈密市| 平顶山市| 长沙县| 壶关县| 永胜县| 达州市| 固阳县| 内黄县| 张家界市| 井冈山市| 德保县| 南丰县| 吴川市| 永顺县| 临沂市| 安徽省| 农安县| 澎湖县|