c++中迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演算法有機的統一起來。
c++資料流迭代器(iterators)一般不直接使用,而是用做某些演算法的引數。這些演算法多是stl中的演算法,是用c習慣了的朋友,應該會覺得這個有點不需太習慣,但是這就是c++的方法,據c++之父bejarne的說法就是**要elegant(優雅)!
多使用資料流,並熟悉這個概念的話,我覺得還是挺好的概念的。
例如下面是乙個簡單的程式:
[cpp]
int main()
; // 原始檔作為輸入流
istream_iteratorii ; //定義其輸入流迭代器
istream_iteratoreos {}; //作為結束符
ofstream os; //定義輸出流
ostream_iteratoroo ; //定義輸出流的迭代器
vectorb ; //用輸入流迭代器和其結束符初始化vector b
sort(b.begin(),b.end()); //stl中的標準排序演算法,對b進行排序
unique_copy(b.begin(),b.end(),oo); //stl中的演算法,copy到輸出流中去,記得前面我們定義了輸出流是ofstream os,就是說輸出流和to目標檔案繫結在一起了,所以copy到輸出流中,其實就是copy到了to檔案裡面了。
return !is.eof() || !os; //最後的輸出狀態如果不是eof結束符或者正常狀態os,就返回錯誤
}檔案輸入流(ifstream)是乙個可以繫結乙個檔案的流, ofstream是乙個可以繫結輸出檔案的流。ofstream_iterator的第二個引數,如:ofstream_iteratoroo,的"\n"是作為乙個定界符,也就是用來分隔各個輸出值的。
elegant,優雅的**,清潔,簡短的**,那麼ugly,verbose 醜陋和冗長的**,所以下面是更加elegant,short的**:
[cpp]
int main()
;ofstream os ;
setb ,istream_iterator{}};
copy(b.begin(),b.end(),ostream_iterator);
return !is.eof() || !os;
}這裡之所以簡短了,是因為用了set代替了vector.set容器的特徵是不保持同樣的資料,所以這裡只用copy就可以了,不用unque_copy了。第二個特徵是set容器的資料自動排序好的了,所以這裡不用sort排序。
這裡setb這句也更加難理解了,因為輸入流迭代器和其結束符都只是用一次就可以了,所以這裡也只用了臨時物件的概念,這個概念就是建立乙個物件,但是沒有物件名字,所以只有呼叫時候可以是用,呼叫完之後也就不存在這個物件了。
reference:
the c++ programming language 4ed chapter04
迭代器是什麼
在學習c stl的時候,整天碰到迭代器,也整天用,但是,到底它是個什麼東西,很多人沒有乙個認識。這裡我通過幾個小的demo,來看看迭代器。首先我實現了乙個十分簡陋的vector類 view plain template class t class vector t begin void insert...
迭代器是什麼
分類 c c 2010 05 07 16 06 1877人閱讀收藏 舉報iterator vector list 演算法insert class 在學習c stl的時候,整天碰到迭代器,也整天用,但是,到底它是個什麼東西,很多人沒有乙個認識。這裡我通過幾個小的demo,來看看迭代器。首先我實現了乙個...
迭代器是什麼
在學習c stl的時候,整天碰到迭代器,也整天用,但是,到底它是個什麼東西,很多人沒有乙個認識。這裡我通過幾個小的demo,來看看迭代器。首先我實現了乙個十分簡陋的vector類 template class t class vector t begin void insert t d typede...