首页 > 代码库 > 编写自己的迭代器
编写自己的迭代器
自定义迭代器必须提供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
编写自己的迭代器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。