首页 > 代码库 > 迭代适配器(一) back_insert和front_insert的简单实现

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

当我们调用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 //FrontInsertIterator40 template <typename Container>41 class FrontInsertIterator42 {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的简单实现