C 程式設計中迭代器是什麼

2021-07-01 19:41:45 字數 1532 閱讀 5778

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...