c stl 五種迭代器

2021-07-10 19:13:18 字數 2685 閱讀 9232

2010-12-31 14:22:25

|  分類:

c++/c|舉報

|字型大小訂閱

我的**書  |

迭代器的分類(iterator categories)

input iterator: 唯讀向前遍歷的迭代器。例如:istream。 

output iterator: 只寫向前遍歷的迭代器。例如:ostream, inserter。 

forward iterator: 可讀可寫向前遍歷的迭代器。 

bidirectional iterator: 可讀可寫雙向遍歷迭代器。例如:list, set, multiset, map, multimap。 

random access iterator: 可讀可寫隨機訪問迭代器。例如:vector, deque, string, array。 

1 input iterators

input iterator只能逐元素的向前遍歷,而且對元素是唯讀的,只能讀取元素一次。通常這種情況發生在從標準輸入裝置(通常是鍵盤)讀取資料時。

下面是input iterator的可用操作列表:

*iter: 唯讀訪問對應的元素 

iter->member: 唯讀訪問對應元素的成員 

++iter: 向前遍歷一步(返回最新的位置) 

iter++: 向前遍歷一步(返回原先的位置) 

iter1 == iter2: 判斷兩個迭代器是否相等 

iter1 != iter2:判斷兩個迭代器是否不等 

type(iter): 複製迭代器 

2 output iterators

output iterator跟input iterator相對應,只能逐元素向前遍歷,而且對元素是只寫的(*iter操作不能作為右值,只能作為左值),只能寫入元素一次。通常這種情況發生在向標準輸出裝置(螢幕或者印表機)寫入資料時,或者利用inserter向容器中追加新元素時。

下面是output iterator的可用操作列表:

*iter = value: 向對應的元素寫入新值 

++iter: 向前遍歷一步(返回最新的位置) 

iter++: 向前遍歷一步(返回原先的位置) 

type(iter): 複製迭代器 

3 forward iterators

forward iterator是input iterator和output iterator的結合,雖然也只能逐元素向前遍歷,但可以對元素進行讀寫操作。下面看forward iterator的可用操作列表:

*iter:  

iter->member:  

++iter:  

iter++:  

iter1 == iter2:  

iter1 != iter2:  

type():  

type(iter):  

iter1 = iter2:  

跟input iterator和output iterator不同的是,forward iterator可以對同一元素訪問多次。

下面我們特別關注一下forward iterator和output iterator的區別:

(1)對於output iterator,寫入資料時不檢查目標容器是否到達結束位置是正確的做法,比如下面迴圈對於output iterator是成立的:

//ok for output iterator

//error for forward iterator

while(true) 

(2)對於forward iterator,則必須保證訪問元素的有效性,那麼上面形式對forward iterator來說是錯誤的,因為當碰到容器end()位置時,導致不確定的後果。對於forward interator,上面形式必須修改為這樣:

while(pos != col1.end()) 

4 bidirectional iterators

雙向迭代器行為特徵類似於forward iterator,只是額外增加了乙個逐元素向後遍歷的能力。所以對於雙向迭代器可用的操作,除了包含forward iterator的所有操作外,多了一組向後遍歷的操作:

--iter: 向後遍歷一步(返回最新的位置) 

iter--: 向後遍歷一步(返回原有的位置) 

5 random access iterators

隨機訪問迭代器除了有雙向迭代器的能力特徵外,還可以進行元素隨機訪問。所以對於隨機訪問迭代器,增加了關於「迭代器運算」的一些操作。下面是除了雙向迭代器的所有操作外,額外的操作列表:

iter[n]: 直接訪問索引為n的元素 

iter+=n: 向前或向後(n為負數)遍歷n個元素 

iter-=n: 先後或向前(n為負數)遍歷n個元素 

iter+n: 返回當前位置後面第n個元素的iterator位置 

n+iter: 同上 

iter-n: 返回當前位置前面第n個元素的iterator位置 

iter1-iter2: 返回iter1和iter2之間的距離(distance) 

iter1iter2: 判斷iter1是否在iter2之後 

iter1<=iter2: 判斷iter1是否不再iter2之後 

iter1>=iter2: 判斷iter1是否不再iter2之前

C STL迭代器 插入迭代器

include stdafx.h include include include include include 演算法庫對所有在容器上的操作有個承諾 決不修改容器的大小 不插入 不刪除 有了插入迭代器,既使得演算法庫可以通過迭代器對容器插入新的元素,又不違反這一承諾,即保持了設計上的一致性。usi...

C STL 迭代器失效

2 刪除 當進行刪除操作 erase,pop back 後,指向刪除點的迭代器全部失效 指向刪除點後面的元素的迭代器也將全部失效。刪除點之前的迭代器仍有效。二 deque迭代器的失效情況 1 插入 1 在deque容器首部或者尾部插入元素不會使得任何迭代器失效。但是指向存在的元素的引用和指標不會失效...

C STL迭代器失效

迭代器失效就是說,對容器進行了一些操作後,先前的迭代器無法進行解引用操作去訪問容器的元素。迭代器失效可能會造成程式崩潰,如下圖 如果插入元素導致vector達到最大容量,那麼會重新分配記憶體並將老的元素拷貝到新的記憶體中。元素的位址都改變了,顯然迭代器和引用都將失效 如果插入元素沒有引起重新分配記憶...