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

C++中的vector中erase用法實例代碼

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

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

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

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

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

2、接下來給出一種常見的錯誤

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

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

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

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

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

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

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

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

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

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

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

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

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

這里有兩種做法:
第一種:我們直接對vector數(shù)組本身進行操作
這里我們介紹一下find()函數(shù):函數(shù)有3個參數(shù),前兩個規(guī)定了找的區(qū)域,第三個是要找的數(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)  //判斷是否重復,如果兩者相等說明沒有重復
      {
         iter = vec.erase(iter);
      }
      else
         iter++;
   }
}

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

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ù)用于在順序型容器中刪除容器的一個元素,有兩種函數(shù)原型,c.erase (p ),c.erase(b,e);第一個刪除迭代器p所指向的元素,第二個刪除迭代器b,e所標記的范圍內(nèi)的元素,c為容器對象,返回值都是一個迭代器,該迭代器指向被刪除元素后面的元素(這個是重點)

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

相關(guān)文章

  • C語言深入講解宏的定義與使用方法

    C語言深入講解宏的定義與使用方法

    在 C 語言中,可以采用命令 #define 來定義宏。該命令允許把一個名稱指定成任何所需的文本,例如一個常量值或者一條語句。在定義了宏之后,無論宏名稱出現(xiàn)在源代碼的何處,預處理器都會把它用定義時指定的文本替換掉
    2022-04-04
  • 基于C++17實現(xiàn)的手寫線程池

    基于C++17實現(xiàn)的手寫線程池

    本文主要介紹了基于C++17實現(xiàn)的手寫線程池,自己實現(xiàn)了Any類,Semaphore類以及Result類的開發(fā),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • C語言求冪計算的高效解法

    C語言求冪計算的高效解法

    這篇文章主要介紹了C語言求冪計算的高效解法,分別演示了求冪運算與整數(shù)次方的解法,具有不錯的參考借鑒價值,需要的朋友可以參考下
    2014-09-09
  • C++實現(xiàn)字符格式相互轉(zhuǎn)換的示例代碼

    C++實現(xiàn)字符格式相互轉(zhuǎn)換的示例代碼

    這篇文章主要為大家詳細介紹了C++中實現(xiàn)字符格式相互轉(zhuǎn)換的方法,主要有UTF8與string互轉(zhuǎn)、wstring與string互轉(zhuǎn),感興趣的小伙伴可以了解一下
    2022-11-11
  • c++核心編程之函數(shù)的重載

    c++核心編程之函數(shù)的重載

    這篇文章主要介紹了c++核心編程之函數(shù)的重載,函數(shù)可以重復使用,提高了復用性,但前提是必須在一個作用域并且函數(shù)名稱相同,下面附代碼詳細介紹,需要的小伙伴可以參考一下
    2022-03-03
  • C++單例模式為何要實例化一個對象不全部使用static

    C++單例模式為何要實例化一個對象不全部使用static

    這篇文章主要介紹了C++單例模式為何要實例化一個對象不全部使用static,文基于C++圍繞主題展開詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • VC創(chuàng)建進程CreateProcess的方法

    VC創(chuàng)建進程CreateProcess的方法

    這篇文章主要介紹了VC創(chuàng)建進程CreateProcess的方法,涉及VC操作進程的基本技巧,需要的朋友可以參考下
    2015-05-05
  • Qt QChart 創(chuàng)建圖表的實現(xiàn)方法

    Qt QChart 創(chuàng)建圖表的實現(xiàn)方法

    這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C++實現(xiàn)班級成績管理系統(tǒng)

    C++實現(xiàn)班級成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)班級成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++有符號和無符號之間的轉(zhuǎn)換問題

    C++有符號和無符號之間的轉(zhuǎn)換問題

    在開發(fā)中經(jīng)常會遇到有符號和無符號之間的轉(zhuǎn)換問題,如果不清楚問題根源,很難解決bug,今天小編通過本文給大家分享c++有符號無符號轉(zhuǎn)換問題,需要的朋友參考下
    2021-07-07

最新評論