適配器的編程

 
反向迭代器
 
反向迭代器是一種反向遍歷容器的迭代器。也就是,從最後一個元素到第一個元素遍歷容器。反向迭代器將自增(和自減)的含義反過來了:對於反向迭代器,++運算將訪問前一個元素,而--運算則訪問下一個元素。
 
(1)反向迭代器需要使用自減操作符:標準容器上的迭代器(reverse_iterator)既支持自增運算,也支持自減運算。但是,流迭代器由於不能反向遍歷流,因此流迭代器不能創建反向迭代器。
(2)可以通過reverse_iterator::base()將反向迭代器轉換爲普通迭代器使用,從逆序得到普通次序。
 
測試:
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
using namespace std;
int main() {
    string str = "this 'sentence' is a test";
    cout<<str<<endl;
   
    string::iterator it1 = find(str.begin(), str.end(), '/'');
    string::iterator it2 = find(++it1, str.end(), '/'');
    cout<<string(it1, it2)<<endl;
   
    string::reverse_iterator rit1 = find(str.rbegin(), str.rend(), '/'');
    string::reverse_iterator rit2 = find(++rit1, str.rend(), '/'');
    cout<<string(rit1, rit2)<<endl;
    cout<<string(rit2.base(), rit1.base())<<endl;
    getchar();
    return 0;
}
 
不同的迭代器支持不同的操作集,而各種算法也要求相應的迭代器具有最小的操作集。因此,可以將算法的迭代器分爲下面五類:
 
 輸入迭代器
(input iterator)
 讀,不能寫。支持的操作集:==, !=, 前綴++, 後綴++, *, ->。例如,find, accumulate算法要求這類迭代器。
 輸出迭代器
(output iterator)
 寫,不能讀。支持的操作集:前綴++, 後綴++, *(只能出現在賦值運算的左操作數上)。推出迭代器要求每個迭代器必須正好寫入一次。例如,ostream_iterator是輸出迭代器,copy算法使用這類迭代器。
 前向迭代器(forward iterator)  讀和寫,支持輸入迭代器和輸出迭代器提供的所有操作,還支持對同一個元素的多次讀寫。例如,replace算法需要這種迭代器。
 雙向迭代器(bidirectional iterator)  讀和寫,除了支持前向迭代器的所有操作,還支持前綴--和後綴--,即支持雙向遍歷容器。例如,reverse算法要求這類迭代器。標準庫容器中提供的迭代器都至少達到雙向迭代器的要求。
 隨機訪問迭代器(random-access iterator)  讀和寫。提供在常量時間內訪問容器任意位置的功能。支持完整的迭代器操作集:1)關係運算:==, !=, <, <=, >, >=;2)算術運算:it + n, it - n, it += n, it -= n以及it1 - it2;3)下標運算:it[n],等價於*(it + n)。需要隨機訪問迭代器的泛型算法包括sort算法。例如,vector, deque, string迭代器是隨機訪問迭代器,用作訪問內置數組元素的指針也是隨機訪問迭代器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章