首页 > 代码库 > 迭代适配器(一) 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的简单实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。