1. 程式人生 > >STL叠代器

STL叠代器

clas 行操作 概念 AC 距離 enc 關於 div 對象

叠代器所指對象的型別,就是value_type

模版參數推導可以獲得,但是如果value_type作為函數返回值類型,那就不可以了,因為模版只能推導參數,不能推導函數返回值。

因此 通過typedef是另外一種方式,將該類型先給緩存起來,然後在進行使用,這是一種實現方式。

但是這種方式對於原生指針是失效的,上面這種方式是將類型放置在了類中,而指針並不是一種類,因此,對於指針類型需要特殊進行處理,這就用到了偏特化了。

偏特化的意思是,是模版的一部分,是在模版這個大前提之下進行的,也就是可以設計出一個僅僅針對於指針的偏特化版本出來。

現在我們就可以針對叠代器的參數為指針做特殊的設計了。

template<class  T>
struct iterator_traits<T*>
{
typedef T value_type
}
// 這樣就通過偏特化的方式可以通過iterator_traits獲取所有叠代器類型的value_type了,只要對應類類型定義了,對應的指針偏特化類型定義了,編譯器就都可以找的到。

兩個叠代器之間的距離,用difference_type來進行表示。

從叠代器所指的內容是否被修改的角度來講,叠代器分為不允許修改的對象指向的內容,可以修改對象指向的內容

reference_type指的就是可以修改指向的內容的一種。對應有一種是const_reference_type類型。

叠代器所指之物和叠代器所指向的內容是兩個不同的概念,前者是值pointer_type 而後者指的是reference_type。

對應的也有const_pointer_type類型。

叠代器器的分類,有5類,分別是

input

output

forward

bidirectional

random access

這個是通過函數重載的方式在編譯階段確定到底是調用那個函數,這就需要借助於 traits的手段了,可以訪問到對應類型的叠代器的具體類型。註意要對原生指針進行偏特化,原生指針是屬於隨即訪問叠代器類型的。

內嵌型別在加上編譯器的模版推導機制,增強了C++未提供關於型別認證方面的能力,彌補了C++不為強類型語言的缺陷。同時這種方式是進行元編程的一種實現方式,就不單純的寫邏輯了,而是在數據類型上面進行操作,沒有運行前都都知道具體的類型是什麽了。簡直厲害的不得了。

叠代器的部分大概就是這些了,其實叠代器是挺好理解了,但是真正的寫出來確實需要真本事,因為有很多細節是需要進行考慮的,感覺C++提供的偏特化。

STL叠代器