Part10 泛型程序設計與C++標準模板庫 10.2叠代器
叠代器是算法和容器的橋梁
叠代器用作訪問容器中的元素
算法不直接操作容器中的數據,而是通過叠代器間接操作
算法和容器獨立
增加新的算法,無需影響容器的實現
增加新的容器,原有的算法也能適用
輸入流叠代器和輸出流叠代器
輸入流叠代器
istream_iterator<T>
以輸入流(如cin)為參數構造
可用*(p++)獲得下一個輸入的元素
輸出流叠代器
ostream_iterator<T>
構造時需要提供輸出流(如cout)
可用(*p++) = x將x輸出到輸出流
二者都屬於適配器
適配器是用來為已有對象提供新的接口的對象
輸入流適配器和輸出流適配器為流對象提供了叠代器的接口
//例10-2從標準輸入讀入幾個實數,分別將它們的平方輸出 #include<iterator> #include<iostream> #include<algorithm> using namespace std; double square(double x){ return x*x; } int main(){ transform(istream_iterator<double>(cin), istream_iterator<double>(), ostream_iterator<double>(cout,"\t"),square); cout << endl; return 0; }
叠代器支持的操作
叠代器是泛化的指針,提供了類似指針的操作(諸如++、*、->運算符)
輸入叠代器
可以用來從序列中讀取數據,如輸入流叠代器
輸出叠代器
允許向序列中寫入數據,如輸出流叠代器
前向叠代器
既是輸入叠代器又是輸出叠代器,並且可以對序列進行單向的遍歷
雙向叠代器
與前向叠代器相似,但是在兩個方向上都可以對數據遍歷
隨機訪問叠代器
也是雙向叠代器,但能夠在序列中的任意兩個位置之間進行跳轉,如指針、使用vector的begin()、end()函數得到的叠代器
叠代器的分類
叠代器的區間
兩個叠代器表示一個區間:[p1, p2)
STL算法常以叠代器的區間作為輸入,傳遞輸入數據
合法的區間
p1經過n次(n > 0)自增(++)操作後滿足p1 == p2
區間包含p1,但不包含p2
叠代器的輔助函數
advance(p, n)
對p執行n次自增操作
distance(first, last)
計算兩個叠代器first和last的距離,即對first執行多少次“++”操作後能夠使得first == last
//例10-3 綜合運用幾種叠代器的示例 #include<iostream> #include<vector> #include<iterator> #include<algorithm> using namespace std; //將來自輸入叠代器的n個T類型的數值排序,將結果通過輸出叠代器result輸出 template<class T, class InputIterator, class OutputIterator> void mySort(InputIterator first, InputIterator last, OutputIterator result){ vector<T> s; for(;first != last; first++) s.push_back(*first); sort(s.begin(), s.end()); //對s進行排序,sort函數的參數必須是隨機訪問叠代器 copy(s.begin(), s.end(), result); //將s序列通過輸出叠代器輸出 } int main(){ //將s數組的內容排序後輸出 double a[5] = {1.2,2.4,0.8,3.3,3.2}; mySort<double>(a,a+5,ostream_iterator<double>(cout," ")); cout << endl; //從標準輸入讀入若幹個整數,將排序後的結果輸出 mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout," ")); cout << endl; return 0; }
Part10 泛型程序設計與C++標準模板庫 10.2叠代器