STL叠代器
叠代器所指對象的型別,就是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叠代器