首页 > 代码库 > 编写自己的迭代器

编写自己的迭代器

自定义迭代器必须提供iterator_traits的五种特性,分别是迭代器类型、元素类型、距离类型、指针类型与reference类型。

这里我们继承标准库提供的iterator<>即可。

代码如下:

 1 #ifndef ITERATOR_H 2 #define ITERATOR_H  3 #include <iterator> 4  5 template <typename Container> 6 class Iterator : public std::iterator<std::output_iterator_tag, void, void, void, void> 7 { 8 public: 9     explicit Iterator(Container &c)10         :_container(c)11     { }12 13     Iterator<Container> &operator= (const typename Container::value_type &value)14     {15         _container.insert(value);16         return *this;17     }18 19     Iterator<Container> operator* ()20     { return *this; }21 22     Iterator<Container> &operator++ ()23     { return *this; }24 25     Iterator<Container> &operator++ (int)26     { return *this; }27 28 protected:29     Container &_container;30 };31 32 template <typename Container>33 Iterator<Container> MyInsert(Container &c)34 {35     return Iterator<Container>(c);36 }37 38 #endif  /*ITERATOR_H*/

注意=操作符执行了insert操作,所以当我们写下:

*iter = 3; 时,  自动将3插入容器中。

 

我们还提供了一个MyInsert函数,用于快速生成迭代器对象,于是我们可以这样使用:

MyInsert(vec) = 55;

 

我们只需改动代码中的

_container.insert(value);

如果改为push_back就变成了back_insert, 相反的, 改为push_front就变成了front_insert。

 

测试代码如下:

 1 #include "iterator.hpp" 2 #include <set> 3 #include <string> 4 #include <iostream> 5 using namespace std; 6  7 template <typename CONT> 8 void print(const CONT &s) 9 {10     for(typename CONT::const_iterator it = s.begin();11         it != s.end();12         ++it)13     {14         cout << *it << " ";15     }16     cout << endl;17 }18 19 int main(int argc, char const *argv[])20 {21     set<int> coll;22 23     Iterator<set<int> > iter(coll);24 25     *iter = 1;26     iter++;27     *iter = 2;28     iter++;29     *iter = 3;30 31     print(coll);32 33     MyInsert(coll) = 44;34     MyInsert(coll) = 55;35 36 37     print(coll);38 39     int vals[] = {33, 67, -4, 13, 5, 2};40     int size = sizeof(vals) / sizeof(vals[0]);41     copy(vals, vals + size, MyInsert(coll));42 43     print(coll);44 45     return 0;46 }

测试结果为:

1 2 3 1 2 3 44 55 -4 1 2 3 5 13 33 44 55 67

 

编写自己的迭代器