程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 頭文件系列(iterator)

C++ 頭文件系列(iterator)

編輯:關於C++

C++ 頭文件系列(iterator)。本站提示廣大學習愛好者:(C++ 頭文件系列(iterator))文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 頭文件系列(iterator)正文


簡介

該頭文件圍繞迭代器展開,定義了一系列與迭代器有關的概念,但最最最重要的一點就是----它和其它容器一同完成了C++容器的Iterator設計形式。

Iterators are a generalization of pointers that allow a C++ program to work with different data structures(containers) in a uniform manner.

上述文字摘自C++14規范草案,簡而言之,迭代器就是對指針的一層封裝,提供了一致的接口。

運用迭代器有很多益處:

  • 訪問數據內容,同時不暴露其外部構造,降低耦合性。
  • 支持multiple traversal(即同時有多個遍歷發作)。
  • 提供一致的訪問接口和多態遍歷(該多態為靜態多態,發作在編譯期)。

詳細請見設計形式。

迭代器類別

迭代器次要有5類([iterator-class]代指該類迭代器支持的操作集):

這裡有兩點需求特別闡明:

  • multi-pass:它的意思是支持同時屢次個遍歷 (這個概念有待驗證)。
  • 解援用:該操作是無限制的,只能呈現在賦值語句的右邊。

不好看出,這幾類迭代器有如下關系:

迭代器 與 指針

由於迭代器實踐上是指針的籠統,很多功用概念都是從指針身上“扒”上去的,所以它的語義跟指針是分歧的。

這意味著什麼呢? 這意味著可以傳入指針作為迭代器, 由於指針上的操作集(遞增、遞加、算數運算等)是迭代器的超集,模版定義對迭代器所做出的操作要求放在指針上完全適用。

這在操縱內置數組的時分,可以省去不少費事(不必再去敲多余的代碼來生成iterators):

int numbers[] = { 1,2,3,4 };
std::find(numbers, numbers + 4, 2); 
迭代器根底設備

規范庫提供了以下4個方面的設備來協助用戶運用iterator。

iterator_traits類

“traits”是特性的意思,所以“iterator_traits”是迭代器特性的意思。 從代碼角度看,這裡的traits就是types,由於這個類只包括了五個類型定義:

  • difference_type
  • value_type
  • reference
  • pointer

  • iterator_category

由於algorithm在C++是獨自的一塊,是iterator將容器與算法溝通在一同。 也就是說,規范庫的算法只是經過迭代器來停止數據操作。 必定而然的,一些操作需求有對應的類型: 1) 例如,使用distance庫函數計算迭代器的間隔,應該前往“間隔”類型的值。 2) 例如,獲取迭代器指向的對象,應該前往“對象值”類型的對象。 等等...

所以,規范庫的算法需求我們定義這些類型,好讓它在使用算法的時分運用正確的類型。

需求留意的是,當迭代器為output iterators時,下面的4個類型能夠被定義為void(能夠關於output iterator來說,這四個類型都沒有多粗心義,它支持的操作十分無限)。

iterator類

下面這個iterator_traits類取自某個庫的iterator完成,可以看到,默許的iterator_traits模版內的類型定義都取自迭代器中相應的類型,即_Iter迭代器類。 所以我們在定義自己的迭代器的時分,假如定義了這些類,就不必再顯示實例化iterator_traits模版了,它能自動提取出這些類型。

這時分就輪到我們的iterator類來大顯神通啦! 用戶只需承繼這個base class並指定兩個參數,就可以取得剩余的三個類型定義,由於它的定義是這樣的:

iterator category tags

對應迭代器類別,這裡也有5類標簽(tag),稱號為XXX_tag,XXX對應迭代器稱號。

這個標簽的作用次要是完成標簽派發功用,提供迭代器類型信息,從而讓C++庫算法可以選擇適宜的、高效的操作來完成算法(可參見下一大節)。

iterator functions

頭文件還提供了一些方便的操縱迭代器的函數供用戶運用:

  • advance(步進)
  • distance(間隔)
  • next(下一個)
  • prev(上一個):只支持雙向迭代器以上(由於單向迭代器不支持“--”操作符)。

關於不同類型的迭代器,上述四個函數采用不同的辦法停止計算,例如:

  • 隨機訪問迭代器支持算數運算,故運用“+”和“-”操作符停止運算(若兩個迭代器辨別為first和last,則計算他們之間的間隔只需求last - first)。
  • 單向迭代器只支持遞增運算,故運用++運算符停止運算(若兩個迭代器辨別為first和last,計算他們之間的間隔需求反復對first停止遞增,知道first == last)
迭代器適配器 類

規范庫包括了三種迭代器適配器:

  1. Reverse iterator:這種迭代器對元素停止反向迭代。 留意,當從某個迭代器結構出reverse iterator時,新的迭代器不再指向先前的元素,而是指向前一個元素(按舊迭代器的順序),由於end iterator逆轉過去才是begin iterator。

  1. Insert iterator:經過迭代器停止元素的拔出時,操作略有不同。 指針通常是指向已有的內存,因而迭代器普通也只是對指向地址的元素停止賦值;而拔出元素是需求先分配內存,再賦值。 為了能讓運用者像運用普通迭代器那樣停止元素的拔出,規范庫提供了3種拔出迭代器:

    • back_insert_iterator
    • front_insert_iterator
    • insert_iterator
  2. Move iterator:挪動迭代器會將外部的迭代器的操作前往值全部轉換成右值(rvalue)。

生成函數(Generators)
  • back_inserter
  • front_inserter
  • inserter
  • make_move_inserter

這些都是全局模版函數,應用類型推導協助用戶結構上述的三種迭代器適配器。

流迭代器

輸出輸入不斷是言語十分重要的局部,關於C++迭代器來說,操縱流(stream)中數據的輸出輸入的重要性無須置疑。 Stream Iterator則是針對stream的一套迭代器,包括istream,ostream,istreambuf 和 ostreambuf。

以下兩種是input iterator:

  • istream_iterator
  • istreambuf_iterator

以下兩種是output iterator:

  • ostream_iterator
  • ostreambuf_iterator



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved