學習筆記 c++ (迭代器)
阿新 • • 發佈:2018-12-14
迭代器
- 迭代器是演算法和容器的橋樑
- 迭代器用作訪問容器中的元素
- 演算法不直接操作容器中的資料,而是通過迭代器間接操作
- 演算法和容器獨立
- 增加新的演算法,無需影響容器的實現
- 增加新的容器,原有的演算法也能適用
輸入流迭代器和輸出流迭代器
-
輸入流迭代器
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