例說資料結構&STL(十二)——iterator

無鞋童鞋發表於2017-07-30

1 白話迭代器(iterator)
  前面其實每個容器介紹的時候都基本解除過迭代器,但是迭代器的使用細節以及不同容器使用條件我覺得還是很有必要好好總結一下,這也就是本文的重點。迭代器在STL中用來將演算法和容器聯絡起來,起著一種膠著劑的作用。
  首先我們還是簡單回顧下迭代器是什麼,迭代器是一種檢查容器內元素並遍歷元素的資料型別。它是一種行為類似指標的物件,它提供類似指標的功能,對容器的內容進行走訪,而指標的各種行為中最常見也最重要的便是“內容提領”和“成員訪問”。因此,迭代器最重要的程式設計工作就是對operator*和operator->進行過載工作。
2 STL中迭代器實戰
 2.1 迭代器標頭檔案
  再熟悉不過,沒什麼需要說的:

#include<iterator>

using namespace std; 

 2.2 迭代器型別
  幾乎STL提供的所有演算法都是通過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器型別,用以存取容器中的元素,如vector:

vector<int>::iterator iter;  // 將iter宣告為int型別的向量迭代器

  這條語句定義了一個名為iter的變數,它的資料型別是由vector定義的iterator型別。每個標準庫容器型別都定義了一個名為iterator的成員,這裡的iterator與迭代器的實際型別相同。術語迭代器通常指的是概念上的迭代器,而術語迭代器型別則是有容器定義的具體的iterator的型別,如vector。
  常見的迭代器型別主要有:迭代器型別iterator、元素的只讀迭代器型別const_iterator、按逆序定址元素的迭代器reverse_iterator、元素的只讀逆序迭代器const_reverse_iterator。
 2.3 迭代器中begin與end

vector<int>::iterator iter = vec.begin();

  begin()返回的迭代器指向容器內第一個元素,end()返回的迭代器指向容器內“最後一個元素的下一個位置”,end()操作返回的迭代器並不指向vector中任何實際的元素,它只是起到一個哨兵的作用,表示我們已經處理完vector中的所有元素。
  rbegin()返回一個逆序迭代器,它指向容器的最後一個元素,rend()返回一個逆序的迭代器,它指向容器的第一個元素前面的位置。
 2.4 迭代器的自增和額外運算
  迭代器型別可使用解引用操作符(*操作符)來訪問迭代器所指向的元素,解引用操作符返回迭代器當前所指向的元素。但是,不能對end()操作返回的迭代器進行解引用。迭代器也可以使用自增操作符向前移動迭代器指向容器中下一個元素,這在形式上與int型物件的自增操作類似。各個迭代器可以使用的操作如下圖所示:

這裡寫圖片描述

  關係操作符只適用於vector和deque容器,這是因為只有這兩種容器為其元素提供快速、隨機的訪問。它們確保可根據元素位置直接有效地訪問指定的容器元素。這兩種容器都支援通過元素的位置實現隨機訪問,因此它們的迭代器可以有效地實現算術和關係運算。
  C++語言使用一對迭代器來標記迭代器的範圍。迭代器範圍:[first, last)是一個左閉合區間,表示範圍從first開始,到last結束,但不包括last,即last指向容器內最後一個元素的下一個元素。注意:如果first不等於last,則對first反覆做自增運算必須能夠到達last;否則,即last位於first之前,則將發生未定義行為。迭代器範圍使用左閉合的意義:因為這樣可以統一表示空集,就無需特別處理。當first和last相等時,迭代器的範圍是空。
 2.5 各容器的迭代器型別
  只有順序容器和關聯容器支援迭代器遍歷,各容器支援的迭代器的類別如下:

這裡寫圖片描述

3 小結
  本文主要介紹了STL庫中迭代器的使用注意事項,並不是所有的容器都支援相同的迭代器操作功能,例如stack,queue,priority_queue介面卡容器型別就不支援迭代器操作。
  以上是個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
  轉載請註明出處:http://blog.csdn.net/FX677588/article/details/76400389


  參考文獻:
  http://blog.csdn.net/hero_myself/article/details/52304794

相關文章