zoukankan      html  css  js  c++  java
  • 迭代器适配器(二) general inserter的简单实现

    general inserter允许用户在指定位置插入。

    实现代码如下:

     1 #ifndef ITERATOR_H
     2 #define ITERATOR_H
     3 #include <iterator>
     4 
     5 //BackInsertIterator
     6 template <typename Container>
     7 class InsertIterator
     8 {
     9 public:
    10     typedef typename Container::value_type value_type;
    11     typedef typename Container::iterator   iterator;
    12 
    13     explicit InsertIterator(Container &cont, iterator iter)
    14         :_cont(cont), _iter(iter)
    15     { }
    16 
    17     InsertIterator<Container> &operator= (const value_type &val)
    18     {
    19         _cont.insert(_iter, val);
    20         ++ _iter;
    21         return *this;
    22     }
    23 
    24     InsertIterator<Container> &operator*()
    25     { return *this; }
    26 
    27     InsertIterator<Container> &operator++()
    28     { return *this; }
    29 
    30     InsertIterator<Container> &operator++(int)
    31     { return *this; }
    32 private:
    33     Container &_cont;
    34     iterator _iter;
    35 };
    36 
    37 template <typename Container>
    38 InsertIterator<Container> inserter(Container &c)
    39 { return InsertIterator<Container>(c); }
    40 
    41 
    42 
    43 #endif

    可以看出,赋值操作使得内部存储的迭代器前移,而++操作同样什么都没有做。

    注意: 不在赋值操作符中改变迭代器,而到++操作中改变————这种做法是不行的。

    执行insert操作时,有个特殊位置为end(),它指向最后一个元素的下一个位置,也就是第一个非法的位置。这也是唯一一个合法的非法位置

    按照上面源码的实现,仅仅在赋值时迭代器前移,iter++无实质操作,而赋值时前移,iter实际指向了新的end()位置,就保证了无论用户怎么执行++操作,都丝毫不会影响iter的有效性

    测试代码如下:

     1 #include "inser.hpp"
     2 #include <iostream>
     3 #include <string>
     4 #include <vector>
     5 using namespace std;
     6 
     7 template <typename T>
     8 void printElems(const T &t, const string &s = "")
     9 {
    10     cout << s << " ";
    11     for(typename T::const_iterator it = t.begin();
    12         it != t.end();
    13         ++it)
    14     {
    15         cout << *it << " ";
    16     }
    17     cout << endl;
    18 }
    19 
    20 int main(int argc, char const *argv[])
    21 {
    22     vector<int> coll;
    23     coll.push_back(12);
    24     coll.push_back(34);
    25     coll.push_back(32);
    26     printElems(coll);
    27 
    28 
    29     inserter(coll, coll.begin()) = 99;
    30     inserter(coll, coll.begin()) = 88;
    31 
    32     printElems(coll);
    33 
    34     inserter(coll, coll.end()) = 34;
    35     inserter(coll, coll.end()) = 21;
    36 
    37     printElems(coll);
    38 
    39     return 0;
    40 }

    测试结果为:

     12 34 32 
     88 99 12 34 32 
     88 99 12 34 32 34 21 
  • 相关阅读:
    【内网穿透】【natapp】web服务映射
    【javascript】日期转字符串
    【springcloud】Transaction rolled back because it has been marked as rollback-only
    MySQL 快速创建索引
    MySQL 快速导入大量数据 资料收集
    基于WinCE的JSON 类库 源码
    C# 模拟提交 Form表单的数据
    git恢复删除的分支及内容
    js数组push方法使用注意
    mint-ui的search组件如何在键盘显示搜索按钮
  • 原文地址:https://www.cnblogs.com/gjn135120/p/4007481.html
Copyright © 2011-2022 走看看