C STL之迭代器

2022-07-11 15:36:13 字數 3647 閱讀 2435

迭代器除了在stl中遍歷序列物件外,還有其他更多的迭代器被iterator所定義。iterator標頭檔案定義迭代器的幾個模板將資料從源傳到目的地。流迭代器(stream iterator)作為指向輸入或輸出流的指標,它們可以用來在流和任何使用迭代器的源或目的地之間傳輸資料,如演算法。插入迭代器(inserter iterator)可以將資料傳輸給乙個基本的序列容器。iterator標頭檔案定義了兩個流迭代器模板,其中istream_iterator用於輸入流,ostream_iterator用於輸出流,t是要從流中提取的或者寫入流中的物件型別。標頭檔案還定義了三個插入模板:inserter、back_inserter和front_inserter,其中t是在其中插入資料的序列容器的型別。

建立輸入流迭代器:

istream_iterator input(cin);

此**建立了乙個istream_iterator型別的迭代器 input,可以指向流中int型別的物件。這個建構函式的實指定與迭代器相關的實際流,因此它是乙個可以從標準輸入流cin中讀取整數的迭代器。預設的istream_iterator建構函式建立乙個end-of-stream迭代器。它等價於通過呼叫容器的end()函式獲得容器的end迭代器。下面**說明了如何建立cin的end-of-stream迭代器來補充input迭代器:

istream_iterator inputend;

現在有了一對迭代器,定義cin中乙個int型別的值的序列,可以用這些迭代器將cin中的值載入到vector中。

vectornumbers;

cout

<<」input numbers , end by zero」

input(cin),inputend;

while(input !=inputend)

可以看出,只要不是cin的end-of-stream,就會繼續執行while輸入資料,那麼怎樣才會產生end-of-stream的條件了,可以輸入ctrl+z或輸入乙個無效的字元(如字母),就會產生end-of-stream條件。

當然,不只限於只能使用輸入流迭代器作為迴圈的控制變數。它們可以向演算法傳遞資料,如numeric標頭檔案中的accumulate()。

cout<<」input numbers separated by spaces and a letter to end」

input(cin),inputend;

cout

<<」the sum of you inputed numbers is

「<0)string data = ;

istringstream input(data);

istream_iterator

begin(input),end;

cout

<<」the sum of you inputed numbers is

「<0.0)《由於從string物件data中建立istringstream物件,因此可以像流一樣從data中讀取資料。此處accumulate()的第三個引數應為0.0,因為第三個引數確定結果的型別,此處保證返回double型別的值。

例項:#include #include

#include

#include

#include

using

std::cout;

using

std::cin;

using

std::endl;

using std::string

;int

main()

插入迭代器(inserter iterator)是乙個可以訪問序列容器vector、deque和list新增新元素的迭代器。有3個建立插入迭代器的模板:

back_insert_iterator在型別t的容器末尾插入元素。容器必須提供push_back()函式。

front_insert_iterator在型別t的容器開頭插入元素。同樣push_front()對容易可用。

insert_iterator在型別t的容器內從指定位置開始插入元素。這要求容器有乙個insert()函式,此函式接受兩個引數,迭代器作為第乙個實參,要插入的項作為第二個實參。

前兩個插入迭代器型別的建構函式接受乙個指定要在其中插入元素的容器的實參。如:

listnumbers;

front_insert_iterator

int> > iter(numbers);

向容器中插入值:

*iter = 99;

也可以將front_inserter()函式用於numbers容器:

front_inserter(numbers) = 99;

這幾行**為numbers列表建立了乙個前段插入器,並用它在開頭插入99。front_inserter()函式的實參是運用迭代器的容器。

insert_iterator迭代器的建構函式需要兩個實參:

insert_iteratorint> > iter(numbers,numbers.begin());

該建構函式的第二個實參是乙個指定在何處插入資料的迭代器。向此容器賦值:

for (int i = 0; i < 100; i++)

*iter = i + 1;

**執行後,前100個元素的值依次為100,99,…,1。

為了補充輸入流迭代器模板,ostream_iterator模板提供了向輸出流寫型別t的物件的輸出流迭代器。

ostream_iterator out(cout);

該模板的實參int指定要處理的資料型別,建構函式實參cout指定將作為資料的目的地的流,以便cout迭代器能將int型別的值寫到標準輸出流中。如:

int data  = ;

vector

numbers(data,data+9

);copy(numbers.begin(),numbers.end(),

out);

在algorithm標頭檔案中定義的copy()演算法將由前兩個迭代器實參指定的物件序列複製到第三個實參指定的輸出迭代器。此**執行結果為:123456789.

但現在寫到標準輸出流中的值沒有空格。第二個輸出流迭代器建構函式能解決這一點:

ostream_iterator out(cout,」 」);

現在將輸出1 2 3 4 5 6 7 8 9

例項:

#include #include 

#include

#include

using

std::cout;

using

std::cin;

using

std::endl;

using

std::vector;

using

std::istream_iterator;

using

std::ostream_iterator;

using

std::back_inserter;

using

std::accumulate;

intmain()

C STL迭代器 插入迭代器

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

C STL 迭代器失效

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

C STL迭代器失效

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