编写自己的迭代器

自定义迭代器必须提供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

 

posted @ 2014-10-05 17:35  (@_@)ゞ  阅读(210)  评论(0编辑  收藏  举报