一.iterator_traits(迭代器萃取機)#include
template struct iterator_traits
假如我們定義了乙個迭代器myiterator
template void my_swap(iter a, iter b)
當函式 以乙個迭代器為引數時,會出現這樣乙個尷尬,tmp的型別是什麼呢?顯然tmp是迭代器iter所指向元素值的型別,但當乙個迭代器例項化前,迭代器自己都不知道自己指向元素的型別,那麼怎麼告知編譯器tmp的型別呢?一種方法是typename myiterator::value_type tmp = *a;
這樣就必須知道iter是myiterator還是其他什麼迭代器,有點麻煩。iterator_traits模板就來幫忙了,通過這樣的表述「typename std::iterator_traits::value_type tmp」,編譯器明白了tmp的型別就是iter指向的元素的型別。這樣當例項化乙個類時,就可以例項化他的迭代器了, 然後可以例項化iterator_traits模板,最後tmp的型別確定了。
iterator_traits模板是面向編譯器的,方便編譯器編譯,但本身不會變成可執行程式。
當迭代器變成指標(當指向const物件時,也需要進行區域性特化處理)時,iterator_traits模板特例化為
template struct iterator_traits;
二.迭代器模板
template struct iterator
;
以迭代器,模板為基類來定義迭代器類
class my_iterator:public std::iterator
這樣迭代器模板就成功將迭代器與iterator_traits模板聯絡起來。
總結:以上迭代器模板與iterator_traits模板是告訴我們,stl對迭代器做了一些標準規定,這方便了我們建乙個迭代器,我
們只要遵守即可,卻不是程式設計時的主要點。
三.stl迭代器成員函式
1.iterator(); iterator (const iterator& y); ~iterator (); iterator & operator = (const iterator & y);
這些是所有迭代器都需要的。
2.其他一些運算子成員函式==, !=, >, <, >=, <=等,及其他我們可以依據具體的類和具體需要來實現的成員函式。
四.具體實現迭代器
迭代器與其容器類之間的互動形式
1.迭代器不能 訪問容器類中的私有成員變數,只能靠容器提供的介面來實現迭代器的功能
迭代器中的主要成員:變數:其指向的容器指標,儲存容器中元素位置的變數
成員函式:以容器為引數的建構函式(將迭代器指向容器),以及其他過載的運算子函式(改
變儲存元素為位置的變數的值並呼叫容器介面得到容器中指定元素的值)。
容器中的主要成員:成員函式:提供介面(以元素位置為引數,返回元素值),生成指向本容器的迭代器
注:當迭代器是以指標儲存容器元素位置時,就無需呼叫容器相應介面,而容器也無需提供此類介面
2.迭代器和容器互為友元類,這樣成員變數的訪問不再是問題
#include #include using namespace std;
template class iter:public iterator
iter(const iter&i):p(i.p){}
iter& operator = (const iter& i)
t & operator *()
t & operator ++()//前置++
private:
t * p;
};template class aggregate
~aggregate(){}
iter begin();
iter end();
private:
t *data;
int length;
};template typename aggregate::iter aggregate::begin() //前面要加typename 否則編譯器會將iter看成是aggregate的成員
template typename aggregate::iter aggregate:: end()
int main()
; aggregatea(d);
aggregate::iter b = a.begin();
++b;
cout << *b << endl;
return 0;
}
C 自定義迭代器
讓我們在示例中看乙個簡單迭代器型別的定義。我們定義乙個類模板,用來表示一段數值型別值,也可以生成指定範圍的開始和結束迭代器。這個迭代器也是模板型別,兩個模板都定義在同乙個標頭檔案 numeric range.h 中。下面是 numeric range模板的定義 template class nume...
c 自定義迭代器練習
include include include include includeusing namespace std 第乙個型別引數可選的值為如下幾種 struct input iterator tag 唯讀 struct mutable iterator tag 只寫 struct output ...
STL自定義比較器
struct person 自定義的比較器 struct comparebyage sort vec.begin vec.end comparebyage 排序傳入我們自定義的比較器map內部的實現使用的是樹,不能夠直接排序,我們可以將其放在乙個vector中,然後自定義乙個比較器去排序 map m...