1. 程式人生 > >學習筆記 c++ (迭代器)

學習筆記 c++ (迭代器)

迭代器

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

輸入流迭代器和輸出流迭代器

  • 輸入流迭代器

    istream_iterator<T>
    
    • 以輸入流(如cin)為引數構造
    • 可用*(p++)獲得下一個輸入的元素
  • 輸出流迭代器

    ostream_iterator<T>
    
    • 構造時需要提供輸出流(如cout)
    • 可用(*p++) = x將x輸出到輸出流
  • 二者都屬於介面卡

    • 介面卡是用來為已有物件提供新的介面的物件
    • 輸入流介面卡和輸出流介面卡為流物件提供了迭代器的介面

例10-2從標準輸入讀入幾個實數,分別將它們的平方輸出

//10_2.cpp
#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

例10-3 綜合運用幾種迭代器的示例

程式涉及到輸入迭代器、輸出迭代器、隨機訪問迭代器這三個迭代器概念,並且以前兩個概念為基礎編寫了一個通用演算法。

//10_3.cpp
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
using namespace std;

//將來自輸入迭代器的n個T型別的數值排序,將結果通過輸出迭代器result輸出
template <class T, class InputIterator, class OutputIterator>
void mySort(InputIterator first, InputIterator last, OutputIterator result) {
    //通過輸入迭代器將輸入資料存入向量容器s中
    vector<T> s;
    for (;first != last; ++first)
        s.push_back(*first);
    //對s進行排序,sort函式的引數必須是隨機訪問迭代器
    sort(s.begin(), s.end());  
    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;
    //從標準輸入讀入若干個整數,將排序後的結果輸出,按Ctrl+d表示輸入結束
    mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout, " "));
    cout << endl;
    return 0;
}
/*
執行結果:
0.8 1.2 2.4 3.2 3.3
2 -4 5 8 -1 3 6 -5
-5 -4 -1 2 3 5 6 8
*/

迭代器的輔助函式

  • advance(p, n)
    • 對p執行n次自增操作
  • distance(first, last)
    • 計算兩個迭代器first和last的距離,即對first執行多少次“++”操作後能夠使得first == last