天天看點

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

督促讀書,總結精華,提煉筆記,抛磚引玉,有不合适的地方,歡迎留言指正。

标準庫vector類型初探,同一種類型的對象的集合(類似數組),是一個類模版而不是資料類型,學名容器,負責管理 和 存儲的元素 相關的記憶體,因為vetcor是類模版,對應多個不同類型,比如int,string,或者自己定義的資料類型等。

程式開頭應如下聲明

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

簡單的vector<xx>類型的變量聲明

問題1、标準庫類型vector初始化的值的類型必須一緻!

vector對象的初始化,vector類模版定義了四個構造函數,無參構造函數,直接初始化的帶參構造函數,初始化為n個值為i的構造函數,還有一種值初始化構造函數。

下面的也沒有問題!

問題2、勿忘它的兩種直接初始化的方式

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

如果既不是帶預設構造函數的類類型,也不是c/c++的内置基本類型,那麼程式設計時,需要手動寫上初始化值具體是多少。還有一種極端,類類型裡沒有定義任何的構造函數,那麼c++标準庫還是會産生一個初始值去依次初始化容器裡的元素。

問題3、需要了解c++标準庫容器對象,比如vector容器的一個重要屬性!

标準庫容器在運作的同時,可以高效的被添加元素,且不用預先配置設定記憶體空間!要知道,vector動态增長的效率高,專家推薦使用,且要知道,這不同于内置基本類型,後續深入,這裡要先記住,不需要提前為容器對象配置設定記憶體。

問題4、對vector容器對象的求長度和判空操作

發現十分類似标準庫string對象的操作,還有數組等,很像的。但是肯丢有不同。這裡要注意,對于容器vector來說,vector類型總是要說明它包含的元素的類型!不能丢!

改為

判空操作(和标準庫類型string的判空類似,空就傳回true)

問題5、對vector容器添加元素的操作push_back()

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

問題6、vector容器對象的下标操作(類似string對象的下标)

可以作為右值,也可以作為左值,同時建議使用标準庫容器的size_type類型來定義下标

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

需要知道的事實:類似size()這樣的小型庫函數,在c++裡都被定義為了内聯函數!

注意:vector容器的下标操作(标準庫string類型同樣類似),僅僅是隻能擷取已經存在的元素,不能添加元素!如下是錯誤的

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

且要知道,vector容器的下标也是類似string對象或者數組,從0開始

這樣的錯誤,就是常見的緩沖區溢出錯誤,很常見,需要注意,對數組也适用,還有标準庫string類型

問題7、輸入一組整數到vector對象,相鄰的元素相加輸出,并提示奇數的情況。

錯誤1:goto語句造成死循環

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

錯誤2:下标溢出錯誤

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

i<ivec.size()這裡出錯,下标溢出,隻有元素個數是偶數的時候不錯,奇數就溢出了。修改後:

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

問題8、讀入一組整數到vector對象,使得頭尾元素兩兩配對,計算和,并輸出奇數元素個數的提示。

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

問題9、讀入一段文本到vector對象,把對象中每個元素裡面的單詞都轉換為大寫之後在輸出,5個一行。

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

問題10、疊代器入門

//c++為每一種标準容器都定義了一種疊代器類型,疊代器是一種——可以檢測容器内的元素并且可以周遊元素的資料類型。除了使用下标來通路vector對象之外,還可以使用疊代器通路,比下标操作更友善,更通用,因為所有的标準庫的容器都支援疊代器,但是隻有部分容器支援下标操作,故成熟的c++程式員應該使用疊代器,而不是下标操作通路容器内的元素。

//記住,每個标準庫容器都定義了自己的疊代器類型,用來周遊自己容器内的元素。

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

//恰恰相反,end函數傳回的疊代器,指向容器内末端元素的下一個元素!記住是下一個!不是最後一個!故end操作傳回的也叫超出末端疊代器。說明end函數傳回的疊代器指向一個不存在的元素,不指向容器内任何實際存在的元素!作用是哨兵!表示我們已經處理完畢容器所有元素!

如果容器為空,則begin函數傳回的疊代器和end函數傳回的疊代器相同。

問題11、vector疊代器的自增、解引用、和比較相等否的操作

如果想要擷取疊代器指向的元素的值,可以使用類似指針的操作,解引用操作!*iter就代表疊代器iter指向的元素的值!比如iter疊代器指向的元素是容器内第一個ivec[0],那麼*iter和ivec[0]是等價語句!

如果想讓疊代器類似下标那樣,移動自己的指向,則可以使用疊代器的自增操作。比如iter++就是疊代器向前移動一個元素的位置!除了這些,疊代器也可以進行比較操作,==、!=操作來比較容器的疊代器,如果兩個疊代器指向同一個元素,則==為真,否則為假。

注意,end函數不指向容器内的元素,故不能對它使用自增或者解引用操作!

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

如果容器為空,則begin函數和end函數傳回的疊代器相等,for循環測試失敗,沒問題!

問題12、兩類隻讀疊代器類型

//類似普通的const常量,但是有差別。比如,如果僅僅想周遊容器的元素,對疊代器有const_iterator類型的疊代器,對它解引用,得到的是指向const對象的引用

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

來對比const類型的疊代器,類似常指針,本身定義的時候必須初始化,本身不能被修改,但是指向的内容可以修改,如

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

注意區分兩者,不要混淆。總結:

const 疊代器是疊代器常量

該疊代器本身的值不能修改,即該疊代器在定義時需要初始化,而且初始化之後,不能再指向其他元素。若需要指向固定元素的疊代器,則可以使用const 疊代器。但是它指向的元素的值可以被修改!

const_iterator 是一種疊代器類型

對這種類型的疊代器解引用會得到一個指向const 對象的引用,即通過這種疊代器通路到的對象是常量。該被指向的對象不能修改,是以,const_iterator 類型隻能用于讀取容器内的元素,不能修改元素的值。若隻需周遊容器中的元素而無需修改它們,則可以使用const_iterator。但是疊代器本身能被修改。兩者相反!

問題13、疊代器的算術操作

其他容器的疊代器類似。除了自增、自減之外,還有其他算術運算适用。

把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)
把《c++ primer》讀薄(3-2 标準庫vector容器+疊代器初探)

注意,疊代器是沒有相加操作的!比如:

也就是說,要求得容器的中間元素,不能這樣寫:

但是可以這樣:

直接定位容器的中間元素,簡單高效,不再需要一次次的去自增或者自減的周遊了。

辛苦的勞動,轉載請注明出處,謝謝……

http://www.cnblogs.com/kubixuesheng/p/4138585.html

繼續閱讀