STL中的迭代器分類

2022-05-02 13:24:10 字數 4885 閱讀 8089

五類迭代器如下:

1、輸入迭代器:唯讀,一次傳遞

為輸入迭代器預定義實現只有istream_iterator和istreambuf_iterator,用於從乙個輸入流istream中讀取。乙個輸入迭代器僅能對它所選擇的每個元素進行一次解析,它們只能向前移動。乙個專門的建構函式定義了超越末尾的值。總是,輸入迭代器可以對讀操作的結果進行解析(對每個值僅解析一次),然後向前移動。

2、輸出迭代器:只寫,一次傳遞

這是對輸入迭代器的補充,不過是寫操作而不是讀操作。為輸出迭代器的預定義實現只有ostream_iterator和ostreambuf_iterator,用於向乙個輸出流ostream寫資料,還有乙個一般較少使用的raw_storage_iterator。他們只能對每個寫出的值進行一次解析,並且只能向前移動。對於輸出迭代器來說,沒有使用超越末尾的值來結束的概念。總之,輸出迭代器可以對寫操作的值進行解析(對每乙個值僅解析一次),然後向前移動。

3、前向迭代器:多次讀/寫

前向迭代器包含了輸入和輸出迭代器兩者的功能,加上還可以多次解析乙個迭代器指定的位置,因此可以對乙個值進行多次讀/寫。顧名思義,前向迭代器只能向前移動。沒有為前向迭代器預定義迭代器。

4、雙向迭代器:operator--

雙向迭代器具有前向迭代器的全部功能。另外它還可以利用自減操作符operator--向後一次移動乙個位置。由list容器中返回的迭代器都是雙向的。

5、隨機訪問迭代器:類似於乙個指標

隨機訪問迭代器具有雙向迭代器的所有功能,再加上乙個指標所有的功能(乙個指標就是乙個隨機訪問迭代器),除了沒有一種「空(null)」迭代器和空指標對應。基本上可以這樣說,乙個隨機訪問迭代器就像乙個指標那樣可以進行任何操作,包括使用操作符operator進行索引,加某個數值到乙個指標就可以向前或者向後移動若干個位置,或者使用比較運算子在迭代器之間進行比較。

迭代器類別

說明輸入迭代器

從容器中讀取元素。輸入迭代器只能一次讀入乙個元素向前移動,輸入迭代器只支援一遍演算法,同乙個輸入迭代器不能兩遍遍歷乙個序列

輸出迭代器

向容器中寫入元素。輸出迭代器只能一次乙個元素向前移動。輸出迭代器只支援一遍演算法,統一輸出迭代器不能兩次遍歷乙個序列

正向迭代器

組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置

雙向迭代器

組合正向迭代器和逆向迭代器的功能,支援多遍演算法

隨機訪問迭代器

組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素

迭代器的操作:

每種迭代器均可進行包括表中前一種迭代器可進行的操作。迭代器的操作本質上是通過過載運算子來實現的,迭代器支援何種操作和能夠執行什麼運算是由迭代器所過載的運算子來決定的。

迭代器型別

操作型別

說明所有迭代器

p++++p

後置自增迭代器

前置自增迭代器s's

輸入迭代器

*pp=p1

p==p1

p!=p1

復引用迭代器,作為右值

將乙個迭代器賦給另乙個迭代器

比較迭代器的相等性

比較迭代器的不等性

輸出迭代器

*pp=p1

復引用迭代器,作為左值

將乙個迭代器賦給另乙個迭代器

正向迭代器

提供輸入輸出迭代器的所有功能

雙向迭代器

--pp--

前置自減迭代器

後置自減迭代器

隨機訪問迭代器

p+=i

p-=i

p+ip-i

p[i]

pp<=p1

p>p1

p>=p1

將迭代器遞增i位

將迭代器遞減i位

在p位加i位後的迭代器

在p位減i位後的迭代器

返回p位元素偏離i位的元素引用

如果迭代器p的位置在p1前,返回true,否則返回false

p的位置在p1的前面或同一位置時返回true,否則返回false

如果迭代器p的位置在p1後,返回true,否則返回false

p的位置在p1的後面或同一位置時返回true,否則返回false

只有順序容器和關聯容器支援迭代器遍歷,各容器支援的迭代器的類別如下:

容器支援的迭代器類別

vector

隨機訪問

deque

隨機訪問

list

雙向set

雙向multiset

雙向map

雙向multimap

雙向stack

不支援queue

不支援priority_queue

不支援五類迭代器如下:

1、輸入迭代器:唯讀,一次傳遞

為輸入迭代器預定義實現只有istream_iterator和istreambuf_iterator,用於從乙個輸入流istream中讀取。乙個輸入迭代器僅能對它所選擇的每個元素進行一次解析,它們只能向前移動。乙個專門的建構函式定義了超越末尾的值。總是,輸入迭代器可以對讀操作的結果進行解析(對每個值僅解析一次),然後向前移動。

2、輸出迭代器:只寫,一次傳遞

這是對輸入迭代器的補充,不過是寫操作而不是讀操作。為輸出迭代器的預定義實現只有ostream_iterator和ostreambuf_iterator,用於向乙個輸出流ostream寫資料,還有乙個一般較少使用的raw_storage_iterator。他們只能對每個寫出的值進行一次解析,並且只能向前移動。對於輸出迭代器來說,沒有使用超越末尾的值來結束的概念。總之,輸出迭代器可以對寫操作的值進行解析(對每乙個值僅解析一次),然後向前移動。

3、前向迭代器:多次讀/寫

前向迭代器包含了輸入和輸出迭代器兩者的功能,加上還可以多次解析乙個迭代器指定的位置,因此可以對乙個值進行多次讀/寫。顧名思義,前向迭代器只能向前移動。沒有為前向迭代器預定義迭代器。

4、雙向迭代器:operator--

雙向迭代器具有前向迭代器的全部功能。另外它還可以利用自減操作符operator--向後一次移動乙個位置。由list容器中返回的迭代器都是雙向的。

5、隨機訪問迭代器:類似於乙個指標

隨機訪問迭代器具有雙向迭代器的所有功能,再加上乙個指標所有的功能(乙個指標就是乙個隨機訪問迭代器),除了沒有一種「空(null)」迭代器和空指標對應。基本上可以這樣說,乙個隨機訪問迭代器就像乙個指標那樣可以進行任何操作,包括使用操作符operator進行索引,加某個數值到乙個指標就可以向前或者向後移動若干個位置,或者使用比較運算子在迭代器之間進行比較。

迭代器類別

說明輸入迭代器

從容器中讀取元素。輸入迭代器只能一次讀入乙個元素向前移動,輸入迭代器只支援一遍演算法,同乙個輸入迭代器不能兩遍遍歷乙個序列

輸出迭代器

向容器中寫入元素。輸出迭代器只能一次乙個元素向前移動。輸出迭代器只支援一遍演算法,統一輸出迭代器不能兩次遍歷乙個序列

正向迭代器

組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置

雙向迭代器

組合正向迭代器和逆向迭代器的功能,支援多遍演算法

隨機訪問迭代器

組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素

迭代器的操作:

每種迭代器均可進行包括表中前一種迭代器可進行的操作。迭代器的操作本質上是通過過載運算子來實現的,迭代器支援何種操作和能夠執行什麼運算是由迭代器所過載的運算子來決定的。

迭代器型別

操作型別

說明所有迭代器

p++++p

後置自增迭代器

前置自增迭代器s's

輸入迭代器

*pp=p1

p==p1

p!=p1

復引用迭代器,作為右值

將乙個迭代器賦給另乙個迭代器

比較迭代器的相等性

比較迭代器的不等性

輸出迭代器

*pp=p1

復引用迭代器,作為左值

將乙個迭代器賦給另乙個迭代器

正向迭代器

提供輸入輸出迭代器的所有功能

雙向迭代器

--pp--

前置自減迭代器

後置自減迭代器

隨機訪問迭代器

p+=i

p-=i

p+ip-i

p[i]

pp<=p1

p>p1

p>=p1

將迭代器遞增i位

將迭代器遞減i位

在p位加i位後的迭代器

在p位減i位後的迭代器

返回p位元素偏離i位的元素引用

如果迭代器p的位置在p1前,返回true,否則返回false

p的位置在p1的前面或同一位置時返回true,否則返回false

如果迭代器p的位置在p1後,返回true,否則返回false

p的位置在p1的後面或同一位置時返回true,否則返回false

只有順序容器和關聯容器支援迭代器遍歷,各容器支援的迭代器的類別如下:

容器支援的迭代器類別

vector

隨機訪問

deque

隨機訪問

list

雙向set

雙向multiset

雙向map

雙向multimap

雙向stack

不支援queue

不支援priority_queue

不支援

STL中iterator迭代器

1 標頭檔案 所有容器有含有其各自的迭代器型別 iterator types 所以當你使用一般的容器迭代器時,並不需要含入專門的標頭檔案。不過有幾種特別的迭代器,例如逆向迭代器,被定義於中。2 迭代器型別 迭代器共分為五種,分別為 input iterator output iterator for...

STL中迭代器失效問題

對於vector deque等連續儲存的容器來說,插入元素 insert 或者刪除元素 erase 會導致後邊的迭代器都失效,解決方法是,erase iter 會返回下乙個有效迭代器的值,刪除元素時用將當前迭代器賦值為erase的返回值,系統會自動將迭代器的指向修改的。for iter cont.b...

STL中的迭代器失效的問題

迭代器失效,有兩個層面的意思 1.無法通過迭代器 操作遍歷整個stl容器。記作 第一層失效。這種情況下,通過 也已經到找不到迭代器的位址。vector是個連續記憶體儲存的容器,如果vector容器的中間某個元素被刪除或從中間插入乙個元素,有可能導致記憶體空間不夠用而重新分配一塊大的記憶體。這個動作將...