stl中迭代器是連線演算法和容器的工具,迭代器可以在不了解容器內部原理的情況下遍歷容器。
迭代器要遍歷容器的元素,所以它內部必須封裝乙個與容器型別相關聯的指標,通過過載++、--、*等操作符實現迭代器操作。
迭代器是乙個類模板,主要包括乙個指標,可以包含各種型別的元素,根據容器的不同,++、--等操作實現也會不同。
迭代器的5個型別,它主要是根據實現的迭代器類來萃取它的類別,通過iterator_traits:: iterator_category可以獲取到在自定義的iter中迭代器的型別。
template迭代器的5個標籤:struct
iterator_traits;
struct主要是用來實現過載,確定使用什麼迭代器進行操作,stl中舉了例子,advance操作可以通過++前向、雙向迭代器、+n隨機迭代器實現,那麼有了這個標籤就可以在編譯時確定使用什麼操作。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中結構體的定義:
template實現的例子,實現vector的隨即隨機遍歷迭代器。_category,
class
_ty,
class _diff =ptrdiff_t,
class _pointer = _ty *,
class _reference = _ty&>
struct
iterator
;
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在實現特定型別容器的時候,會繼承iterator結構體,並且指定迭代器型別與資料型別:struct iterator_traits;
template在實現容器時,內部會用typefdef對應乙個迭代器型別:class myiterator : public iterator
template對迭代器的型別訪問就是通過iterator_traits來實現的,class
myvector;
比如說有乙個函式要計算給定迭代器區間內某個元素出現的次數:
//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...