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規范草案,簡而言之,迭代器就是對指針的一層封裝,提供了一致的接口。
運用迭代器有很多益處:
詳細請見設計形式。
迭代器類別迭代器次要有5類([iterator-class]代指該類迭代器支持的操作集):
這裡有兩點需求特別闡明:
不好看出,這幾類迭代器有如下關系:
迭代器 與 指針由於迭代器實踐上是指針的籠統,很多功用概念都是從指針身上“扒”上去的,所以它的語義跟指針是分歧的。
這意味著什麼呢? 這意味著可以傳入指針作為迭代器, 由於指針上的操作集(遞增、遞加、算數運算等)是迭代器的超集,模版定義對迭代器所做出的操作要求放在指針上完全適用。
這在操縱內置數組的時分,可以省去不少費事(不必再去敲多余的代碼來生成iterators):
int numbers[] = { 1,2,3,4 }; std::find(numbers, numbers + 4, 2);迭代器根底設備
規范庫提供了以下4個方面的設備來協助用戶運用iterator。
iterator_traits類“traits”是特性的意思,所以“iterator_traits”是迭代器特性的意思。 從代碼角度看,這裡的traits就是types,由於這個類只包括了五個類型定義:
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頭文件還提供了一些方便的操縱迭代器的函數供用戶運用:
關於不同類型的迭代器,上述四個函數采用不同的辦法停止計算,例如:
規范庫包括了三種迭代器適配器:
Insert iterator:經過迭代器停止元素的拔出時,操作略有不同。 指針通常是指向已有的內存,因而迭代器普通也只是對指向地址的元素停止賦值;而拔出元素是需求先分配內存,再賦值。 為了能讓運用者像運用普通迭代器那樣停止元素的拔出,規范庫提供了3種拔出迭代器:
Move iterator:挪動迭代器會將外部的迭代器的操作前往值全部轉換成右值(rvalue)。
這些都是全局模版函數,應用類型推導協助用戶結構上述的三種迭代器適配器。
流迭代器輸出輸入不斷是言語十分重要的局部,關於C++迭代器來說,操縱流(stream)中數據的輸出輸入的重要性無須置疑。 Stream Iterator則是針對stream的一套迭代器,包括istream,ostream,istreambuf 和 ostreambuf。
以下兩種是input iterator:
以下兩種是output iterator: