C 自定義迭代器

2021-09-02 22:29:15 字數 4260 閱讀 9601

讓我們在示例中看乙個簡單迭代器型別的定義。我們定義乙個類模板,用來表示一段數值型別值,也可以生成指定範圍的開始和結束迭代器。這個迭代器也是模板型別,兩個模板都定義在同乙個標頭檔案 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...