stl將容器(containers)和演算法(algorithms)分隔開,兩者之間的紐帶就在於迭代器(iterators)。
迭代器也是一種智慧型指標,過載了例如常見的operator*
以及operator->
。
迭代器有常見的五種相應型別:
iterator_category
value_type
difference_type
pointer
reference
假設迭代器有:ite,ite2
:
1.value_type
: 迭代器所指物件的型別,假設ite
是乙個mutable iterator
,則*ite
返回的型別就是value_type
。
2.reference
:迭代器所指物件的引用型別,假設ite
是乙個const iterator
,則*ite
返回的型別就是reference
。
2.difference_type
: 兩個同型別迭代器之間的距離,例如ite-ite2
。
3.pointer
:operator->
返回的型別。
4.iterator_category
: 迭代器的分類。
iterator_category
有五種,分別是:
input iterator(輸入迭代器)
output iterator(輸出迭代器)
forward
iterator(前向迭代器)
bidirectional iterator(雙向迭代器)
random access iterator(隨機訪問迭代器)
這五種迭代器的關係並不是完全的繼承關係,而是繼承中帶叢屬的關係:
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 {};
輸入/輸出/前向迭代器支援的操作符過載有:
operator*,operator++,operator==,operator!=,operator->
雙向迭代器在上述的基礎上還支援:
operator--
隨機訪問迭代器在雙向迭代器的基礎上還支援:
operator
<, operator, operator+=, operator-=
各個容器的迭代器型別:
-vector
:隨機訪問迭代器,本質是t*
,尤其要注意支援operator<
和operator
,因此經常可以看到這樣訪問vector:
vector
vec(10);
for(int i = 0; i < 10; ++i)
for(auto ite = vec.begin(); ite < vec.end(); ++ite)
list
li(10);
for(int i = 0; i < 10; ++i)
for(auto ite = vec.begin(); ite < vec.end(); ++ite)
hash_seths;
//some init
...for(auto ite = hs.end() - 1; ite != ite.begin(); --ite)
STL迭代器簡介
stl迭代器簡介 標準模板庫 the standard template library,stl 定義了五種迭代器。下面的圖表畫出了這幾種 input output forward bidirectional random access 要注意,上面這圖表並不是表明它們之間的繼承關係 而只是描述了迭...
STL容器簡介以及迭代器介紹
容器 container 是用於存放資料的類模板。在使用容器時,即將容器類模板例項化為容器類時,會指明容器中存放的元素是什麼型別的。在容器中,可以存放基本型別的變數,也可以存放物件,而物件或基本型別的變數被插入容器中時,實際插入的是物件或變數的乙個複製品。容器分為兩大類,順序容器和關聯容器。順序容器...
迭代器簡介
迭代器提供了比下標操作更通用的遍歷容器雷元素的方法。其對所有的容器都適用,現代c 程式更加傾向於適用迭代器而不是下標操作。迭代器測試 vector iterator begin v3.begin 指向容器的第乙個元素 vector iterator end v3.end z指向容器末端元素的下乙個 ...