标签:style blog color io os 使用 ar for sp
自定义迭代器必须提供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
标签:style blog color io os 使用 ar for sp
原文地址:http://www.cnblogs.com/gjn135120/p/4007219.html