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

 

posted @ 2014-10-05 22:10  (@_@)ゞ  阅读(275)  评论(0编辑  收藏  举报