java - C++ STL迭代器声明的iterator和reverse_iterator实质区别?是不同数值吗?

查看:216
本文介绍了java - C++ STL迭代器声明的iterator和reverse_iterator实质区别?是不同数值吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

问1:Vector<int>::reverse_iterator r1和Vector<int>::iterator r2。
r1和r2作用是截然不同的,这个:reverse_iterator和iterator实质是不同数值吗,为什么会有这个作用?

问2:ostream_iterator<int,char>out_iter(cout," ");括号(cout," ")是什么意思,这是个构造函数?为什么cout能给int赋值?

解决方案

问1
reverse_iterator和iterator是两个定义在vector类模板内的迭代器类型。实现上可能是不同的类,如:


template </* ... */>
class vector {
 public:
  class ReverseIterator {...};
  class Iterator {...};

  using reverse_iterator = ReverseIterator;
  using iterator = Iterator;
};

reverse_iterator的迭代方向和iterator相反。即若r1和r2指向同一个元素,r1+1r2-1指向同一个元素(若有效,且它们分别重载了operator+operator-)。

实现迭代方向相反是通过不同的operator实现来实现的。如若迭代器内部通过指针来实现,reverse_iterator的operator++的实现可自减该指针,而iterator的operator++实现可自增该指针。

问2
ostream_iterator<int, char> out_iter(cout, " ");是声明并定义一个变量,且直接初始化(direct initialize)该变量。(cout, " ")是实际参数列表。编译器会尝试根据这个参数列表选择一个构造函数,并将这些参数"传给"该构造函数。

根据标准,cout不能给int赋值,请给出相关代码。但cout可以被转换成bool(c++11之后)或void *(c++11之前)类型。这是因为cout的类型继承了basic_ios的一个实例,而用于实例化该实例的basic_ios类模板定义了相关转换操作符。即可以bool x = std::cout;

这篇关于java - C++ STL迭代器声明的iterator和reverse_iterator实质区别?是不同数值吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆