Bootstrap

c++迭代器

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

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

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

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

    vector<int> 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<int> 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<int>(cout);
*out=1;//将1加入到 out里(即cout<<1)
*out=2;//将1加入到 out里(即cout<<2)

//*out="b";     error ,上面已经指定了流迭代器类型为int

//输出v1的每个元素, 第二个参数可用于控制分隔标志
copy(v1.begin(),v1.end(), ostream_iterator<int>(cout,"\n"));

三:next()与prev()

上面提到advance无返回值, 且会修改原迭代器

而boost库的next()和prior函数,  标准库里的next()和prev()提供可以获取第n个迭代器但不改变原迭代器的功能

boost库的next函数简要, 其中用了模板元编程

template<typename T>
inline T next(T x)
{return ++x;}

template<typename T,typename Distance>
inline T next(T x,Distance n) //这里传形参不传引用
{
    std::advance(x,n);  //不改变实参
    return ++x;
}

而标准库里的next()则使用了默认参数=1

template<class ForwardIterator>
ForwardIterator next(ForwardIterator x, difference_type n = 1);

四:iterator_traits库

iterator_traits库用来获取迭代器(或指针)的属性

可以获取以下五种类型信息

iterator_category        :迭代器的分类
        value_type          :值的类型
        pointer                :指针类型
difference_type           :距离类型
        reference            :引用类型

其中iterator_category即迭代器的分类在标准库里有以下几种

输入迭代器: 只读迭代器,只提供operator++, 可以比较相等

输出迭代器: 只写迭代器,只提供operator++,不能比较

前向迭代器:可以读写, 提供operator++, 可以比较相等赋值

双向迭代器: 在前向迭代器基础上提供operator--

随机访问迭代器: 双向迭代器基础上增加了迭代器的算术运算功能, 提供operator[]operator+=<

;