标签: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