首页 > 代码库 > 迭代器适配器(二) general inserter的简单实现

迭代器适配器(二) 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 

 

迭代器适配器(二) general inserter的简单实现