栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++模板: 迭代器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++模板: 迭代器

一: 迭代器辅助函数, 方便的操作迭代器

advance(Iterator, n) : 使迭代器前进或后退n个位置, 直接改动迭代器, 不返回值

distance(Iterator_first,Iterator_last ): 计算两个迭代器的距离

iter_swap(Iterator ,Iterator) 交换两个迭代器所指元素的值, 不是交换两个迭代器

    vector v1;
    v1={1,2,3};

    auto i1=v1.begin();
    auto i2=v1.end();
    auto i3=v1.end();
    assert(  i2==i3  );
    iter_swap(i1,i2);
    assert(  i2==i3  ); //交换后还成立

二: 迭代适配器:把一种迭代器转换为另一种迭代器

标准库里有如下几种

逆向迭代器: 反序迭代

转移迭代器: 迭代器返回右值引用

插入迭代器: 赋值操作转换为插入操作

流迭代器:    把IO流转换为迭代器操作

 

插入迭代器:

    vector v1,v2;

    //直接创建v1的插入迭代器
    auto it=back_inserter(v1);
    *it=1;//将1加入到v1中。
    *it=2;//将2加入到v1中

    //对v2创建插入迭代器, 把v1的元素全部插入到v2
    copy(v1.begin(),v1.end(), back_inserter(v2));

流迭代器:

//直接创建cout的流迭代器
auto out=ostream_iterator(cout);
*out=1;//将1加入到 out里(即cout<<1)
*out=2;//将1加入到 out里(即cout<<2)

/
        int i;
        for(i=0 ;i  first(s), last(s + sizeof(s)); //改不了步长, step_iterator无效, 还是默认步长2,
    copy(first, last, ostream_iterator(cout));
    return 0;
}

六:iterator_adaptor

派生自iterator_facade, 同样使用了基类链技术, 用法和iterator_facade差不多, 但只需编写少数核心变化的操作函数即可, 用法较简单

有6个模板参数, 通常只用前2个

  template <
      class Derived
    , class Base
    , class Value        = use_default
    , class Traversal    = use_default
    , class Reference    = use_default
    , class Difference   = use_default
  >
  class iterator_adaptor;

被适配对象(Adaptee)必须是可拷贝构造和可赋值的, 不一定要有operator++, 也就是说不一定是一个迭代器

用法示例一

#include
#include "boost/iterator/iterator_adaptor.hpp"
using namespace std;

template
class array_iter:public boost::iterator_adaptor,P>
{
    static_assert(  is_pointer_v

); //保证P是一个指针 public: using super_type = typename array_iter::iterator_adaptor_; //用iterator_adaptor_ 省去了写出一长串模板参数列表声明父类 array_iter(P x):super_type(x){} //必要的构造函数 }; int main() { int a[10]={1,2,3}; array_iter start(a),finish(a+10); start+=1; copy(start,finish,ostream_iterator(cout)); return 0; }

示例二: 实现访问存储增量数值

每次访问递增迭代器, 就把容器的值加上

值引用类型处须加const, 否则会造成非const引用的问题

大概是这个原因吧?目前不太清楚 

(35条消息) C++非const引用问题:error: cannot bind non-const lvalue reference of type_sampson MrLiang的博客-CSDN博客

#include
#include "boost/iterator/iterator_adaptor.hpp"
using namespace std;

template
class array_iter : public boost::iterator_adaptor, P>
{
    static_assert(is_pointer_v

); //保证P是一个指针 public: using super_type = typename array_iter::iterator_adaptor_; //用iterator_adaptor_ 省去了写出一长串模板参数列表声明父类 array_iter(P x) : super_type(x) {} //必要的构造函数 }; template class delta_iterator : public boost::iterator_adaptor< delta_iterator, I, typename iterator_traits::value_type, //值类型 boost::single_pass_traversal_tag, //单向遍历 typename iterator_traits::value_type const> //值引用类型, 只读,不加const会报错 { friend class boost::iterator_core_access; //必须的友元声明 using this_type = delta_iterator; using super_type = typename this_type::iterator_adaptor_; //基类定义 typename super_type::value_type m_value; //存储当前的值 public: delta_iterator(const I &iter) : super_type(iter), m_value(0) //当前值从0开始 {} private: using super_type::base; using super_type::base_reference; typename super_type::reference dereference() const { return m_value + *base(); //返回存储的值+当前的值 } void increment() { m_value += *base(); //存储的值+=当前的值 ++base_reference();//迭代器前进 } }; int main() { vector a = {1, 2, 3, 4}; delta_iterator start(a.begin()), finish(a.end()); copy(start, finish, ostream_iterator(cout, ",")); return 0; }

//输出->
1,3,6,10

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号