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

C++中的vector中erase用法實(shí)例代碼

 更新時(shí)間:2022年11月24日 09:41:27   作者:信手?jǐn)佚? 
在vector數(shù)組中我們刪除數(shù)組經(jīng)常用的就是erase方法,但是earse的用法一不注意就會(huì)出錯(cuò),今天我就遇到了,所以在這里總結(jié)一下,避免大家用錯(cuò),對(duì)vector中erase用法感興趣的朋友跟隨小編一起看看吧

  在vector數(shù)組中我們刪除數(shù)組經(jīng)常用的就是erase方法,但是earse的用法一不注意就會(huì)出錯(cuò),今天我就遇到了,所以在這里總結(jié)一下,避免大家用錯(cuò)。

1、首先介紹一下erase函數(shù)的原型:

iteratorerase(iterator position);
iteratorerase(iterator first, iterator last);

我們可以看到erase函數(shù)有兩種函數(shù)原型,一種是給定要?jiǎng)h除的位置,另一種是給定刪除的區(qū)域。

2、接下來給出一種常見的錯(cuò)誤

for(auto iter=vec.begin();iter!=vec.end(); iter++)
{
      if(*iter == 3)
            veci.erase(iter);
}

  這里面隱藏著一個(gè)很嚴(yán)重的錯(cuò)誤:當(dāng)veci.erase(iter)之后,iter就變成了一個(gè)野指針,對(duì)一個(gè)野指針進(jìn)行 iter++ 是肯定會(huì)出錯(cuò)的。
  我們通過查閱文檔可以看到erase函數(shù)的返回值是這么介紹的:一個(gè)迭代器,指定在任何刪除的元素之后剩余的第一個(gè)元素,如果不存在這樣的元素,則指定指向向量結(jié)尾的指針

將代碼改成這樣就可以了:

for(auto iter=vec.begin();iter!=vec.end(); iter++)
{
      if(*iter == 3)
            iter = veci.erase(iter);
}

  但是這種代碼也是存在缺陷的,首先是我們無法連續(xù)刪除數(shù)字3,其次是迭代器在指向vec.end()的時(shí)候,還會(huì)進(jìn)行一次++,這就發(fā)生了數(shù)組越界,所以我們一概這樣修改:

for(auto iter=vec.begin();iter!=vec.end(); )
{
     if( *iter == 3)
          iter = veci.erase(iter);//當(dāng)刪除時(shí)erase函數(shù)自動(dòng)指向下一個(gè)位置,就不需要進(jìn)行++
      else
            iter ++ ;    //當(dāng)沒有進(jìn)行刪除的時(shí)候,迭代器++
}

另一種解決無法刪除連續(xù)的數(shù)字的方法

我們先介紹一下remove函數(shù):
remove是個(gè)stl的通用算法std::remove(first,last,val)移除[first, last)范圍內(nèi)等于val的元素在vector里面用就類似于 iter=std::remove(vec.begin(), vec.end(), val)但這個(gè)函數(shù)只是把val移到vec的末尾,并不真正刪除,真正刪除還是要調(diào)用一次erase函數(shù)

veci.erase(remove(vec.begin(),vec.end(),3),vec.end());

3、刪除重復(fù)元素,并且順序不發(fā)生變化

  如果不要求順序的話,我們可以直接調(diào)用unique函數(shù)進(jìn)行操作,這里介紹一下unique函數(shù):從頭到尾,判斷當(dāng)前元素是否等于上一個(gè)元素,將不重復(fù)的元素移到前面來(賦值操作),而不是將重復(fù)的元素移動(dòng)到后面去。
函數(shù)的參數(shù)是:
first:去重的起點(diǎn)的迭代器位置。
last:去重的終點(diǎn)的迭代器位置,不包括
pred:自定義判斷重復(fù)方式。
返回值:去重以后vector中沒有重復(fù)元素的下一個(gè)位置的迭代器。

vec.erase(unique(vec.begin(),vec.end()),vec.end())  //將重復(fù)的區(qū)域刪除

但是如果要求數(shù)字順序不能發(fā)生變化呢?

這里有兩種做法:
第一種:我們直接對(duì)vector數(shù)組本身進(jìn)行操作
這里我們介紹一下find()函數(shù):函數(shù)有3個(gè)參數(shù),前兩個(gè)規(guī)定了找的區(qū)域,第三個(gè)是要找的數(shù)字。如果找到,返回其迭代器,找不到返回-1

void fun(vector<int>& vec)
{
   for(auto iter=vec.begin(); iter!=vec.end();)
   {
      auto iter1=find(vec.begin(),iter,*iter);
      if(iter!=iter1)  //判斷是否重復(fù),如果兩者相等說明沒有重復(fù)
      {
         iter = vec.erase(iter);
      }
      else
         iter++;
   }
}

第二種:創(chuàng)建一個(gè)vector來存放沒有重復(fù)的元素

vector<int> fun(vector<int>& vec)
{
   vector<int> temp;
   for(auto iter=vec.begin(); iter!=vec.end(); iter++;)
   {
      auto iter1=find(vec.begin(),iter,*iter);
      if(iter==iter1) 
      {
         temp.push_back(*iter);
      }        
   }
}

總結(jié):

  erase()函數(shù)的用法: erase()函數(shù)用于在順序型容器中刪除容器的一個(gè)元素,有兩種函數(shù)原型,c.erase (p ),c.erase(b,e);第一個(gè)刪除迭代器p所指向的元素,第二個(gè)刪除迭代器b,e所標(biāo)記的范圍內(nèi)的元素,c為容器對(duì)象,返回值都是一個(gè)迭代器,該迭代器指向被刪除元素后面的元素(這個(gè)是重點(diǎn))

到此這篇關(guān)于C++中的vector中erase用法代碼的文章就介紹到這了,更多相關(guān)vector中erase用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ pair的基本用法總結(jié)整理

    C++ pair的基本用法總結(jié)整理

    這篇文章主要介紹了C++ pair的基本用法總結(jié)整理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C語言基礎(chǔ)使用IDE快速開發(fā)的方法

    C語言基礎(chǔ)使用IDE快速開發(fā)的方法

    這篇文章主要介紹了C語言基礎(chǔ)使用IDE快速開發(fā)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 基于C++ cin、cin.get()、cin.getline()、getline()、gets()函數(shù)的使用詳解

    基于C++ cin、cin.get()、cin.getline()、getline()、gets()函數(shù)的使用詳解

    學(xué)C++的時(shí)候,這幾個(gè)輸入函數(shù)弄的有點(diǎn)迷糊;這里做個(gè)小結(jié)
    2013-05-05
  • C語言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法

    C語言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法

    這篇文章主要介紹了C語言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法,涉及C語言進(jìn)行三角函數(shù)與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目

    C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 解析C語言與C++的編譯模型

    解析C語言與C++的編譯模型

    C++繼承了C的編譯模型,C語言的編譯鏈接模型相對(duì)簡潔,但C++繼承了這些機(jī)制之后變得更加復(fù)雜難以理解,這里就來帶大家簡要解析C語言與C++的編譯模型
    2016-05-05
  • C語言進(jìn)階:指針的進(jìn)階(5)

    C語言進(jìn)階:指針的進(jìn)階(5)

    這篇文章主要介紹了C語言指針詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價(jià)值。需要的朋友可以了解下
    2021-09-09
  • Opencv?視頻讀取與寫入的實(shí)現(xiàn)示例

    Opencv?視頻讀取與寫入的實(shí)現(xiàn)示例

    本文將介紹如何使用OpenCV進(jìn)行視頻讀寫。通過閱讀本文,您將了解如何讀取視頻文件、處理視頻幀、寫入視頻文件等操作,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • C語言實(shí)現(xiàn)圖書管理系統(tǒng)課程設(shè)計(jì)

    C語言實(shí)現(xiàn)圖書管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)圖書管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++交換指針實(shí)例

    C++交換指針實(shí)例

    這篇文章主要介紹了C++交換指針實(shí)例,針對(duì)C與C++交換指針的方法進(jìn)行了較為詳細(xì)的對(duì)比分析,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

隆回县| 环江| 彰武县| 雅安市| 杭州市| 保定市| 满洲里市| 苏尼特右旗| 政和县| 虎林市| 泸西县| 博客| 开远市| 香港| 京山县| 新竹市| 马尔康县| 鹿邑县| 抚松县| 烟台市| 蚌埠市| 琼结县| 南京市| 甘泉县| 鄂托克前旗| 巧家县| 鄂温| 鄢陵县| 丹棱县| 海林市| 镇原县| 高邑县| 即墨市| 新宁县| 洮南市| 邢台市| 金沙县| 荃湾区| 江源县| 平凉市| 普兰县|