码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-06 00:03:19      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   strong   sp   

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的简单实现

标签:style   blog   color   io   os   ar   for   strong   sp   

原文地址:http://www.cnblogs.com/gjn135120/p/4007481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!