讓我們在示例中看乙個簡單迭代器型別的定義。我們定義乙個類模板,用來表示一段數值型別值,也可以生成指定範圍的開始和結束迭代器。這個迭代器也是模板型別,兩個模板都定義在同乙個標頭檔案 numeric_range.h 中。下面是 numeric_range模板的定義:
template class numeric_iterator; // template type declaration
// defines a numeric range
templateclass numeric_range
, step , count {}
// return the begin iterator for the range
numeric_iteratorbegin()
// return the end iterator for the range
numeric_iteratorend()
};
型別引數 t 是序列的值型別,因此它必定是數值型別。對於模板主體中的函式 static_assert(),當 t 不是整型也不是浮點型時,它的第乙個引數會為 false,這時會生成一條包含第二個字串引數的編譯時錯誤訊息。這裡使用的斷言模板定義在標頭檔案 type_traits 中,模板中還有一些其他的編譯時模板型別引數檢查斷言。這個建構函式的三個引數都有預設值,因此它也可以作為無參建構函式。這三個引數分別用來初始化值、指定乙個值到另乙個值的增量,以及指定值的個數。因此預設定義了又有兩個值的元素段:0 和 1。編譯器會在需要時,提供適當的拷貝建構函式。
另有兩個成員函式生成,然後返回元素段的開始和結束迭代器。結束迭代器的成員變數 value 的值為最後乙個 value+1。結束迭代器是通過修改開始迭代器的 value 生成的。numeric_itemtor模板型別的宣告在其定義之前是必要的,因為還沒有定義迭代器型別模板。numeric_iterator模板被指定為這個模板的友元類,這樣 numeric_iterator的例項就可以訪問numeric_range的私有成員。numeric_range模板也需要成為 numeric_iterator的友元類,因為 numeric_range的成員函式 end() 需要訪問 numeric_iterator的乙個私有成員。
這個迭代器的模板型別定義如下:
// iterator class template- it's a forward iterator
templateclass numeric_iterator : public std::iterator < std::forward_iterator_tag, t >
, value {};
// assignment operator
numeric_iterator& operator=(const numeric_iterator& src)
// dereference an iterator
t& operator*()
return value;
}// prefix increment operator
numeric_iterator& operator++()
value += range.step; // increment the value by the range step
return *this;
}// postfix increment operator
numeric_iterator operator++(int)
auto temp = *this;
value += range.step; // increment the value by the range step
return temp; // the iterator before it's incremented
}// comparisons
bool operator<(const numeric_iterator& iter) const
bool operator==(const numeric_iterator& iter) const
bool operator!=(const numeric_iterator& iter) const
bool operator>(const numeric_iterator& iter) const
bool operator<=(const numeric_iterator& iter) const
bool operator>=(const numeric_iterator& iter) const
};
**看起來雖多,卻很簡單直白。這個迭代器有乙個成員變數,它儲存了乙個和它相關聯的 numeric_range 物件的引用,另外還儲存了它所指向元素的值。迭代器的建構函式的引數是乙個 numeric_range 物件的引用。建構函式用引數初始化成員變數 range,並將成員變數 value 的值設為 numeric_range 的 start。
還定義了一些解引用運算子、字首或字尾自增運算子以及一套比較運算子。對元素段的結束迭代器的解引用或自增都是非法的,因此如果運算元是結束迭代器,那麼自增運算子函式和解引用運算子函式都會丟擲異常;這表明成員變數 value 超出了元素段中的最後乙個值。為了簡單,選擇丟擲乙個標準異常。
主檔案 numeric_range.c 的完整內容如下:
// exercising the numeric_range template
#include // for copy()
#include // for accumulate()
#include // for standard streams
#include // for vector container
#include "numeric_range.h" // for numeric_range& numeric_iteratorint main()
; auto first = range.begin();
auto last = range.end();
std::copy(first, last, std::ostream_iterator(std::cout, " "));
std::cout << "\nsum = " << std::accumulate(std::begin(range), std::end(range), 0.0) << std::endl;
// initializing a container from a numeric_range
numeric_rangenumbers ;
std::vectordata ;
std::cout << "\nvalues in vector are:\n";
std::copy(std::begin(data), std::end(data), std::ostream_iterator(std::cout, " "));
std::cout << std::endl;
// list the values in a range
std::cout << "\nthe values in the numbers range are:\n";
for (auto n : numbers)
std::cout << n << " ";
std::cout << std::endl;
}
執行結果為:
1.5 2 2.5 3 3.5
sum = 12.5
values in vector are:
15 19 23 27 31 35 39 43 47 51
the values in the numbers range are:
15 19 23 27 31 35 39 43 47 51
生成的第乙個 numeric_range 例項有 5 個 double 型元素,它們從 1.5 開始,每次增加 0.5。numeric_range 的迭代器用來在 copy() 演算法中將值複製到 ostream_iterator。這表明演算法可以接受這個迭代器。第二個 numeric_range 例項有 10 個 long 型元素。在 vector 容器的初始化列表中,使用開始和結束迭代器,然後用 copy() 演算法輸出 vector 中的元素。最後,為了演示它的工作原理,以 for 迴圈的方式輸出它的值。輸出表明 numeric_range 模板成功建立了整型和浮點型的元素段,我們成功定義了乙個可以使用 stl 的迭代器型別。
c 自定義迭代器練習
include include include include includeusing namespace std 第乙個型別引數可選的值為如下幾種 struct input iterator tag 唯讀 struct mutable iterator tag 只寫 struct output ...
C 自定義迭代器(STL)
一.iterator traits 迭代器萃取機 include template struct iterator traits 假如我們定義了乙個迭代器myiterator template void my swap iter a,iter b 當函式 以乙個迭代器為引數時,會出現這樣乙個尷尬,t...
開發自定義python 迭代器
class test object def init self,data iter,stop self.data iter data iter self.stop stop self.start 0 def iter self return self def next self self.start...