一: 迭代器辅助函数, 方便的操作迭代器
advance(Iterator, n) : 使迭代器前进或后退n个位置, 直接改动迭代器, 不返回值
distance(Iterator_first,Iterator_last ): 计算两个迭代器的距离
iter_swap(Iterator ,Iterator) 交换两个迭代器所指元素的值, 不是交换两个迭代器
vectorv1; 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流转换为迭代器操作
插入迭代器:
vectorv1,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



