一: 迭代器辅助函数, 方便的操作迭代器
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)
//*out="b"; error ,上面已经指定了流迭代器类型为int
//输出v1的每个元素, 第二个参数可用于控制分隔标志
copy(v1.begin(),v1.end(), ostream_iterator(cout,"\n"));
三:next()与prev()
上面提到advance无返回值, 且会修改原迭代器
而boost库的next()和prior函数, 标准库里的next()和prev()提供可以获取第n个迭代器但不改变原迭代器的功能
boost库的next函数简要, 其中用了模板元编程
template
inline T next(T x)
{return ++x;}
template
inline T next(T x,Distance n) //这里传形参不传引用
{
std::advance(x,n); //不改变实参
return ++x;
}
而标准库里的next()则使用了默认参数=1
template
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+=<