c++學習之容器——erase()函式
先介紹erase()函式的用法,erase()函式用於在順序型容器中刪除容器的一個元素,有兩種函式原型,c.erase(p),c.erase(b,e);第一個刪除迭代器p所指向的元素,第二個刪除迭代器b,e所標記的範圍內的元素,c為容器物件,返回值都是一個迭代器,該迭代器指向被刪除元素後面的元素(這個是重點),具體的詳細用法請參考其他資料。
這裡就有一個問題,比如《c++ primer》習題9.26,該題目要求如下:
有一個數組int a[] ={0,1,1,2,3,5,8,13,21,55,89};要求將該陣列儲存到一個vector容器中和一個list容器中,然後將vector容器中的偶數刪除,將list容器中的奇數刪除,關於本題,該書課後答案核心程式碼如下:
for(list<int>::iterator iter = ilst.begin();
iter != ilst.end();iter++
){
if((*iter) %2 == 1){
// int tmp = *iter;
iter = ilst.erase(iter);
--iter;
// continue;
}
// iter++;
}
這個只是一段核心演算法程式碼,基本上考慮到了該考慮的問題,比如說刪除一個元素之後,指標指向該刪除元素的後面一個元素,如果迴圈再加1,就跳過了被刪除元素的下一個元素,但是存在一個很嚴重的問題,我們看Vertor段的程式碼:
然後以第一個資料為例,刪除了第一個元素0之後,返回的iter指向下一個元素1,然後做自減運算,這時就出現了問題,前面的元素0已經刪除,這個時候自減運算得到的結果就是一個野指標,程式就會出現問題。也就是說上面的程式碼形式對不同的資料的順序會產生不同的結果,可能會出錯 ,這顯然不是我們要的。所以我將程式碼改為如下形式:for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++ ){ if((*iter) %2 == 0){ // int tmp = *iter; iter = ivec.erase(iter); --iter; // continue; } // iter++; }
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); //iter++ ){ if((*iter) %2 == 0){ // int tmp = *iter; iter = ivec.erase(iter); // --iter; continue; } iter++; }
以這樣的形式,資料的順序就不會影響結果,而且也不會出現野指標的問題,考慮到第二個erase()函式,我覺得對erase()函式的用法不能有太大的限制,我們在對容器操作,刪除容器內元素,使用erase函式時,需要時刻記住的有兩點:
第一個就是erase函式的返回值是一個指向被刪除元素的下一個元素的迭代器。
第二點就是使用完erase函式之後的迭代器是否會產生野指標。這樣的話在寫程式碼的時候就不會產生很大的問題。
寫這篇文章主要是發現網上關於容器的erase()函式介紹不夠詳細,如果有什麼問題,歡迎批評指正。
相關推薦
c++學習之容器——erase()函式
先介紹erase()函式的用法,erase()函式用於在順序型容器中刪除容器的一個元素,有兩種函式原型,c.erase(p),c.erase(b,e);第一個刪除迭代器p所指向的元素,第二個刪除迭代器b,e所標記的範圍內的元素,c為容器物件,返回值都是一個迭代器,該迭代器
C++學習之容器的摸索
初學容器,容易犯錯的地方 1.vector,list和deque都是順序容器。其中vector和deque都可以通過下標訪問,而list不能 2. 容器的begin和end操作 c.begin()返回一個迭代器,它指向容器c的第一個元素 c.end()返回一個迭代器,它指向容
c++學習之路:2.預設引數&函式過載&堆記憶體分配
預設引數 規則:程式從右向左延伸讀取 例子:如下sortarr函式,在創造函式的時候可以直接賦值,這樣執行的時候就執行預設值。 又如debug函式,不傳參就會列印------------------; 函式過載 理解:幾個同名函式,所設有的引數不一樣,就代表為不同函式。 所以傳參的時候
C++學習之分支語句和邏輯運算子(if語句、邏輯表示式、字元函式庫(cctype)和?:運算子)
1.當C++程式必須決定是否執行某個操作時,通常使用if語句來實現操作。if有兩種格式:if和if else. if(test-condition) statement 如果測試條件為true,則if語句將載入程式執行語句或語句塊;如果條件是false,程式將跳
c++學習之路:2.預設引數&函式過載&堆記憶體分配
預設引數 規則:程式從右向左延伸讀取 例子:如下sortarr函式,在創造函式的時候可以直接賦值,這樣執行的時候就執行預設值。 又如debug函式,不傳參就會列印------------------; 函式過載 理解:幾個同名函式,所設有的引數不一樣,就代表為
菜鳥的C#學習之旅——C#方法過載與函式過載
目錄 過載 方法過載 函式過載 總結 過載 過載,簡單說,就是函式或者方法有相同的名稱,但是引數列表不相同的情形,這樣的同名不同引數的函式或者方法之間,互相稱之為過載函式或者方法。 過載的
C++學習之floor函式,ceil函式和round函式
做題時經常需要截斷小數點,向上取整或者向下取整,以前使用printf("%.2f",n);進行截斷操作,但如果資料不需要輸出,這種做法就行不通了,此時可以使用floor函式向下取整或者ceil函式向上取整。標頭檔案:#include<cmath>一.flo
C++學習之深入理解虛擬函式--虛擬函式表解析
前言 C++中的虛擬函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父類型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有“多種形態”,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的程式碼來實現可變的演算
C++學習之多型篇(虛擬函式和虛解構函式的實現原理--虛擬函式表)
通過下面的程式碼來說明: #include <iostream> #include <stdlib.h> #include <string> using namespace std; /** * 定義動物類:Animal * 成員
虛擬函式 virtual function 筆記(與繼承)----C++學習之路
1.虛擬函式的概念 在語法上,只要在成員函式前加上virtual,例如:virtual void draw() const =0; 所謂繼承其實就是繼承函式的呼叫權。子類可以呼叫父函式的函式。 但是當我們子類要去修改這個函式,則要用到虛擬函式。 2.虛擬函式的分類
C++學習之建構函式的理解--模板形式的建構函式不會遮掩編譯器生成的預設建構函式
我們都知道編譯器會為我們定義預設的空引數建構函式和複製建構函式,其實複製建構函式和一般的帶引數的建構函式的區別也就僅僅在與此(我認為),也就是在不顯示定義複製建構函式的時候,系統會為我們合成一個預設的複製建構函式。 1.定義一般的建構函式時,系統還是會為我們生成一個預設的複
Ndk學習之JNI建構函式(java-->C-->Java)
1.在Java中定義建構函式(無參的不寫沒事,不被覆蓋就行)並獲取 public native Object accessConstaructor(); 2.javah生成標頭檔案 JNIEXP
C# 學習之接口(寫給自己,沒有權威,歡迎糾正)
教程 pub oid 沒有 命名 自己 特性 face 但是 重新學習了C#的三大特性,發現接口一直沒有使用,都快忘了,廢話不說,這裏沒有代碼,主要是描述給我自己看的(主要是網上的教程都是W3的,沒有什麽口語化的描述) 1、 接口是需要實例的,在使用的時候一定要實例
OBJECTIVE-C學習之宏定義
list com 學習 c學習 ive 宏定義 objective cti lis %E6%B5%85%E8%B0%88aNDROID%E7%89%88%E6%9C%AC%E7%9A%84%E5%8C%BA%E5%88%AB http://music.baidu.com/
C++學習之路——直接插入排序
sin alt nbsp namespace ios include 數據結構 log ins 一個人獨自學習,感覺有進步就滿足,即便是數據結構沒學好,算法也找不清思路,但把人家的代碼看看理解好打出來,也挺滿意的。 1 #include <iostrea
C#學習之設計模式:工廠模式
缺陷 進行 type 系列 concrete 改變 cnblogs static 優劣 最近研究一下設計模式中工廠模式的應用,在此記錄如下: 什麽是工廠模式? 工廠模式屬於設計模式中的創造型設計模式的一種。它的主要作用是協助我們創建對象,為創建對象提供最佳的方式
C++學習之控制程序流程
技術 bubuko ++ 分享圖片 程序 log .com 圖片 ali 使用 if...else進行條件編程 C++學習之控制程序流程
C++學習之Pair
!= pos 包含 string類 spa 操作 vector cond 運行 一、Pair類型概述 pair是一種模板類型,其中包含兩個數據值,兩個數據的類型可以不同,基本的定義如下: pair<int, string> a; 表示a中有兩個類
C++學習之路(六):關於C++提供的強制類型轉換
code 記錄 是不是 通過 行修改 單元 c語言 enum 表達式 C語言中提供了舊式的強制類型轉換方法。比如: int a =1; char *p = (char *)&a; 上述將a的地址單元強制轉換為char類型的指針。這裏暫且不說上述轉換結果是否合理,但
C++ 學習 之Struct
man 包含 基礎 滿足 問題 private繼承 UC c++ 什麽 轉自https://blog.csdn.net/bestconvenient/article/details/30734139 最開始,就讓我們來討論一下一個最最基本,也最最容易被人忽視掉的問題&m