STL 迭代器學習

2022-06-25 07:12:16 字數 3579 閱讀 4862

stl中迭代器是連線演算法和容器的工具,迭代器可以在不了解容器內部原理的情況下遍歷容器。

迭代器要遍歷容器的元素,所以它內部必須封裝乙個與容器型別相關聯的指標,通過過載++、--、*等操作符實現迭代器操作。

迭代器是乙個類模板,主要包括乙個指標,可以包含各種型別的元素,根據容器的不同,++、--等操作實現也會不同。

迭代器的5個型別,它主要是根據實現的迭代器類來萃取它的類別,通過iterator_traits:: iterator_category可以獲取到在自定義的iter中迭代器的型別。

template 

struct

iterator_traits;

迭代器的5個標籤:

struct

input_iterator_tag{};//唯讀

struct

output_iterator_tag{};//只寫

struct forward_iterator_tag:public

input_iterator_tag{};//前向移動

struct bidirectional_iterator_tag:public

forward_iterator_tag{};//雙向移動

struct random_access_iterator_tag:public bidirectional_iterator_tag{};//隨機訪問

主要是用來實現過載,確定使用什麼迭代器進行操作,stl中舉了例子,advance操作可以通過++前向、雙向迭代器、+n隨機迭代器實現,那麼有了這個標籤就可以在編譯時確定使用什麼操作。

stl中結構體的定義:

template

_category,

class

_ty,

class _diff =ptrdiff_t,

class _pointer = _ty *,

class _reference = _ty&>

struct

iterator

;

實現的例子,實現vector的隨即隨機遍歷迭代器。

templateclass obj_iterator : public std::iterator //

繼承了iterator,並指定迭代器型別與資料型別

obj_iterator( obj

*p , size_t index ) : m_obj(p) , m_index(index){}//

建構函式完成對資料成員的初始化

obj_iterator& operator = ( const obj_iterator &t )

bool

operator ==( const obj_iterator &rh ) const

bool

operator !=( const obj_iterator &rh ) const

obj_iterator

operator ++()

obj_iterator

operator ++( int

)

obj_iterator

operator --()

t& operator *() const

//過載取內容操作

t* operator ->() const

//這個實現+n,也就是隨機訪問操作,如果只是前向迭代器的話,不會過載這個函式

const obj_iterator operator +(size_t n)

//過載+=操作

const obj_iterator operator +=(size_t n)

difference_type

operator -(const obj_iterator &n)

obj_iterator

operator -(size_t n)

bool

operator

< (const obj_iterator n) const

};

那麼實現容器:

template class

obj iterator end()

....

//如果有計算長度的函式,那麼返回型別就是iterator_traits::difference_type

#輸出:

struct

std::random_access_iterator_tag

struct

std::random_access_iterator_tag

struct std::bidirectional_iterator_tag

對原生內建型別也有特化迭代器型別:

template 

struct iterator_traits;

在實現特定型別容器的時候,會繼承iterator結構體,並且指定迭代器型別與資料型別:

template

class myiterator : public iterator

在實現容器時,內部會用typefdef對應乙個迭代器型別:

template

class

myvector;

對迭代器的型別訪問就是通過iterator_traits來實現的,

比如說有乙個函式要計算給定迭代器區間內某個元素出現的次數:

//

template function count_if

template

_init,

class _pr>inline

typename iterator_traits

<_init>::difference_type//

返回型別

_count_if(_init _first, _init _last, _pr _pred)

//在呼叫時:

myvector mv(10

); mv[

3] = 10; mv[9] = 10

; myvector

::iterator it =mv.begin();

cout

<< count_if(mv.begin(), mv.end(), eq_10) <

//那麼count_if函式獲取到的第乙個型別_init就是myvector::iterator型別,即myiterator

//那麼iterator_traits>::difference_type就可以知道

STL學習之迭代器

迭代器提供了順序訪問容器中每個元素的方法。迭代器可以使用 運算子獲得下乙個元素的迭代器,可以使用 運算子訪問當前迭代器所指向的元素。如果元素型別是結構體或類,還可以使用 運算子直接訪問該元素的乙個成員。以下是個人在學習迭代器時獲得得一些見解。輸入流迭代器用來從乙個輸入流中連續地輸入某種型別的資料,它...

STL學習筆記14 迭代器

所有的容器都定義了自己的迭代器型別,所以一般情況下,不需要再自己新增迭代器標頭檔案。但是如果要使用一些特殊的迭代器,如反向迭代器,或者一些迭代器輔助函式,那麼就需要新增標頭檔案。型別能力 提供者輸入迭代器 一次向前讀取 istream 輸出迭代器 向前寫入 ostream,inserter 前向迭代...

STL迭代器技術

stl迭代器技術 c stl和各種容已提供了自己的迭代器,如輸入迭代器,輸出迭代器,前向迭代器,雙向迭代器,隨機迭代器。但是 stl在已有迭代器的基礎上,仍然定義了另外一些迭代器,以簡化某些情況下的操作。一般在 stl iterator.h 檔案中提供。1 輸入流迭代器 istream iterat...