C++ insert_iterator实现的学习(Boolan学习笔记第10周)

本文详细介绍了C++ STL中的inserter函数如何通过copy和insert_iterator实现元素的插入操作。通过对inserter内部机制的剖析,揭示了其如何在不破坏原有容器结构的情况下完成元素的插入。

C++的inserter可以把一些数值插入到现有容器的已存在的数值里面,举例如下:

    int myints[]={10,20,30,40,50,60,70};
    vector<int> myvec(7);
    copy(myints, myints+7, myvec.begin());

    list<int> foo, bar;
    for (int i=1; i<5; i++)
    {
        foo.push_back(i);
        bar.push_back(i*10);
    }

    list<int>::iterator it=foo.begin();
    advance(it,3);

    copy(bar.begin(), bar.end(), inserter(foo, it));

其实现效果为

这里写图片描述

看起来好像很简单,但是如果深入一下好像并不简单。首先我们来看copy()这个函数。stl里面copy的代码实现可以简化为

template<class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)
{
    while(first!=last){
      *result = *first;
      ++result;
      ++first;
    }

    return result;
}

我们可以看出,copy就是将result的内容逐一拷贝到目标地址(从first开始)而已,这是覆盖,根本就不是插入嘛。那么insert功能是怎么实现的呢?

继续深入, inserter其实就是insert_iterator的一个wrapper函数而已,其实现代码如下:

template<class Container, class Iterator>
inline insert_iterator<Container> inserter(Container &x, Iterator i)
{
   typedef typename Container::iterator iter;
   return insert_iterator<Container>(x,iter(i));
}

继续深入,看看class insert_iterator长什么样。其实现代码可以简化如下:

template<class Container>
class insert_iterator {
    protected: 
       Container* container;
       typename Container::iterator iter;
    public:
       typedef output_iterator_tag iterator_category;

    insert_iterator(Container& x, typename Container::iterator i): container(&x), iter(i) {}

    insert_iterator<Container> & operator=(const typename Container::value_type& value)
    {
       iter=container->insert(iter, value);
       ++iter;
       return *this;
    }   
};

我们可以看出点名堂出来了,关键在insert_iterator重载了operator=, 在重载函数中又调用了container->insert,使得insert iterator永远随着其target贴身移动。

在copy()函数中, 里面的

 *result = *first;

就会调用insert_iterator里面的operator=重载函数,这样,就实现了插入功能。看来操作符重载的功能真的很强大啊。

下面是一个包含自定义 `back_insert_iterator` 模板类和 `back_inserter` 函数的 C++ 代码示例: ```cpp #include <iostream> #include <vector> // 自定义 back_insert_iterator 模板类 template <typename Container> class back_insert_iterator { public: using container_type = Container; using value_type = typename Container::value_type; using difference_type = typename Container::difference_type; using pointer = typename Container::pointer; using reference = typename Container::reference; explicit back_insert_iterator(Container& c) : container(&c) {} back_insert_iterator& operator=(const value_type& value) { container->push_back(value); return *this; } back_insert_iterator& operator*() { return *this; } back_insert_iterator& operator++() { return *this; } back_insert_iterator operator++(int) { return *this; } private: Container* container; }; // 自定义 back_inserter 函数 template <typename Container> back_insert_iterator<Container> back_inserter(Container& c) { return back_insert_iterator<Container>(c); } int main() { std::vector<int> vec; back_insert_iterator<std::vector<int>> inserter = back_inserter(vec); *inserter = 1; inserter++; *inserter = 2; inserter++; *inserter = 3; for (int num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` 在这个代码中,首先定义了一个自定义的 `back_insert_iterator` 模板类,该类重载了赋值运算符、解引用运算符和自增运算符,以实现向容器末尾插入元素的功能。然后定义了一个 `back_inserter` 函数,用于快速创建 `back_insert_iterator` 对象。在 `main` 函数中,创建了一个 `std::vector` 容器,并使用自定义的 `back_inserter` 函数和 `back_insert_iterator` 向容器中插入元素,最后输出容器中的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值