zoukankan      html  css  js  c++  java
  • 编写自己的迭代器

    自定义迭代器必须提供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
  • 相关阅读:
    mongodb单机搭建
    elasticsearch-6.2.3单机搭建
    zookeeper集群搭建
    JavaScript高级程序设计-读书笔记(6)
    JavaScript高级程序设计-读书笔记(5)
    JavaScript高级程序设计-读书笔记(4)
    JavaScript高级程序设计-读书笔记(3)
    JavaScript高级程序设计-读书笔记(2)
    JavaScript高级程序设计-读书笔记(1)
    activity通过流程实例id动态获取流程图并展示在jsp页面上
  • 原文地址:https://www.cnblogs.com/gjn135120/p/4007219.html
Copyright © 2011-2022 走看看