c 學習之容器 erase 函式

2021-08-24 17:33:48 字數 1385 閱讀 9357

先介紹erase()函式的用法,erase()函式用於在順序型容器中刪除容器的乙個元素,有兩種函式原型,c.erase(p),c.erase(b,e);第乙個刪除迭代器p所指向的元素,第二個刪除迭代器b,e所標記的範圍內的元素,c為容器物件,返回值都是乙個迭代器,該迭代器指向被刪除元素後面的元素(這個是重點),具體的詳細用法請參考其他資料。

這裡就有乙個問題,比如《c++ primer》習題9.26,該題目要求如下:

有乙個陣列int a =;要求將該陣列儲存到乙個vector容器中和乙個list容器中,然後將vector容器中的偶數刪除,將list容器中的奇數刪除,關於本題,該書課後答案核心**如下:

for(

list

<

int>::iterator iter = ilst.begin();

iter != ilst.end();iter++

)// iter++;

}

這個只是一段核心演算法**,基本上考慮到了該考慮的問題,比如說刪除乙個元素之後,指標指向該刪除元素的後面乙個元素,如果迴圈再加1,就跳過了被刪除元素的下乙個元素,但是存在乙個很嚴重的問題,我們看vertor段的**:

for(

vector

<

int>::iterator iter = ivec.begin();

iter != ivec.end(); iter++

)// iter++;

}

然後以第乙個資料為例,刪除了第乙個元素0之後,返回的iter指向下乙個元素1,然後做自減運算,這時就出現了問題,前面的元素0已經刪除,這個時候自減運算得到的結果就是乙個野指標,程式就會出現問題。也就是說上面的**形式對不同的資料的順序會產生不同的結果,可能會出錯 ,這顯然不是我們要的。所以我將**改為如下形式:

for(

vector

<

int>::iterator iter = ivec.begin();

iter != ivec.end();

//iter++

)iter++;

}

以這樣的形式,資料的順序就不會影響結果,而且也不會出現野指標的問題,考慮到第二個erase()函式,我覺得對erase()函式的用法不能有太大的限制,我們在對容器操作,刪除容器內元素,使用erase函式時,需要時刻記住的有兩點:

第乙個就是erase函式的返回值是乙個指向被刪除元素的下乙個元素的迭代器。

第二點就是使用完erase函式之後的迭代器是否會產生野指標。這樣的話在寫**的時候就不會產生很大的問題。

multiset容器erase函式的誤用

從缺陷中學習c c 第3章庫函式問題,本章主要介紹庫函式的使用中會遇到的問題。使用庫函式可以降低軟體開發的難度,提高 編寫的效率。本節為大家介紹multiset容器erase函式的誤用。2013 11 28 15 29 收藏 分享 3.16 multiset容器erase函式的誤用 示例 int m...

C 函式的用法 erase函式

前面的文章中提到過如何向容器中新增元素,這裡介紹乙個如何刪除容器中元素的函式,包括順序容器和關聯容器。就是這個erase函式,基本用法如下 c.erase p 從c中刪除迭代器p指定的元素,p必須指向c中的乙個真實元素,不能等於c.end c.erase b,e 從c中刪除迭代器對b和e所表示的範圍...

C 學習之容器學習

集合類的容器全部在 system.collections 名字空間下,c 2.0 由於增添了對泛型程式設計的支援,它又新增了乙個名字空間 system.collections.generic,存放所有支援泛型的各種集合類的容器。非泛型類容器 實現好的容器有 arraylist,bitarray,ha...