1. 程式人生 > >Part10 泛型程序設計與C++標準模板庫 10.2叠代器

Part10 泛型程序設計與C++標準模板庫 10.2叠代器

main inf 數據 序列 3.3 距離 結果 示例 res

叠代器是算法和容器的橋梁
  叠代器用作訪問容器中的元素
  算法不直接操作容器中的數據,而是通過叠代器間接操作
算法和容器獨立
  增加新的算法,無需影響容器的實現
  增加新的容器,原有的算法也能適用

輸入流叠代器和輸出流叠代器
輸入流叠代器
  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叠代器