zoukankan      html  css  js  c++  java
  • 迭代适配器(一) 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 //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
  • 相关阅读:
    解析HTTP协议六种请求方法
    金蝶
    普元
    中间件
    [CTSC2008] 网络管理
    【Uva 10498】满意值
    【SPOJ839】最优标号
    bzoj2879 [Noi2012]美食节
    bzoj3144 [Hnoi2013]切糕
    bzoj3112 [Zjoi2013]防守战线
  • 原文地址:https://www.cnblogs.com/gjn135120/p/4007464.html
Copyright © 2011-2022 走看看