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

迭代适配器(一) back_insert和front_insert的简单实现

时间:2014-10-05 23:38:49      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   strong   sp   div   c   on   

当我们调用copy函数时,要确保目标容器足够大,例如:

//将vec的所有元素拷贝到以coll.begin()为起始地址的位置
copy(vec.begin(), vec.end(), coll.begin());

如果之前没有为coll分配好足够的内存,就会引发越界错误。

如果我们无法提前为coll预分配内存,可使用如下代码:

//将vec的所有元素拷贝到以coll.begin()为起始地址的位置
copy(vec.begin(), vec.end(), back_insert(coll.begin()));

back_insert是一种插入迭代器,插入迭代器就是帮我们屏蔽插入元素的细节,使得iter看起来总是指向一个"可用的位置"。

需要注意一下几点:

1.插入迭代器本质上是一种适配器,但是它看起来像一个迭代器,行为像一个迭代器,那么他就符合迭代器的定义。

2.插入迭代器的赋值,内部采用了插入元素的做法,可能调用容器的push_back push_front或者insert等。

3.插入迭代器的++操作,只是个幌子,但必不可少。以上面的copy为例,内部肯定调用了iter++,因为copy函数只是把它当做普通迭代器。

4.解引用操作同样也是幌子。

back_insert和front_insert实现代码如下:

 1 #ifndef ITERATOR_H
 2 #define ITERATOR_H
 3 #include <iterator>
 4 
 5 //BackInsertIterator
 6 template <typename Container>
 7 class BackInsertIterator
 8 {
 9 public:
10     typedef typename Container::value_type value_type;
11 
12     explicit BackInsertIterator(Container &cont)
13         :_cont(cont)
14     { }
15 
16     BackInsertIterator<Container> &operator= (const value_type &val)
17     {
18         _cont.insert(_cont.end(), val);
19         return *this;
20     }
21 
22     BackInsertIterator<Container> &operator*()
23     { return *this; }
24 
25     BackInsertIterator<Container> &operator++()
26     { return *this; }
27 
28     BackInsertIterator<Container> &operator++(int)
29     { return *this; }
30 private:
31     Container &_cont;
32 };
33 
34 template <typename Container>
35 BackInsertIterator<Container> backInsert(Container &c)
36 { return BackInsertIterator<Container>(c); }
37 
38 
39 //FrontInsertIterator
40 template <typename Container>
41 class FrontInsertIterator
42 {
43 public:
44     typedef typename Container::value_type value_type;
45 
46     explicit FrontInsertIterator(Container &cont)
47         :_cont(cont)
48     { }
49 
50     FrontInsertIterator<Container> &operator= (const value_type &val)
51     {
52         _cont.insert(_cont.begin(), val);
53         return *this;
54     }
55 
56     FrontInsertIterator<Container> &operator*()
57     { return *this; }
58 
59     FrontInsertIterator<Container> &operator++()
60     { return *this; }
61 
62     FrontInsertIterator<Container> &operator++(int)
63     { return *this; }
64 private:
65     Container &_cont;
66 };
67 
68 template <typename Container>
69 FrontInsertIterator<Container> frontInsert(Container &c)
70 { return FrontInsertIterator<Container>(c); }
71 
72 #endif

 

迭代适配器(一) back_insert和front_insert的简单实现

标签:style   blog   color   使用   strong   sp   div   c   on   

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

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