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:问1reverse_iterator和iterator是两个定义在vector类模板内的迭代器类型。实现上可能是不同的类,如:
template </* ... */>class vector { public: class ReverseIterator {...}; class Iterator {...}; using reverse_iterator = ReverseIterator; using iterator = Iterator;};
reverse_iterator的迭代方向和iterator相反。即若r1和r2指向同一个元素,r1+1和r2-1指向同一个元素(若有效,且它们分别重载了operator+和operator-)。
实现迭代方向相反是通过不同的operator实现来实现的。如若迭代器内部通过指针来实现,reverse_iterator的operator++的实现可自减该指针,而iterator的operator++实现可自增该指针。
问2ostream_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;
回答2:什么叫两个数值。。reverse_iterator和iterator是迭代器,实质是两个类模板通过在类的内部重新实现函数的不同细节来实现不同功能,但对外接口一致
实例化一个对象out_iter,类型是ostream_iterator<int,char>,传入构造函数的参数是cout和' '
“cout能给int赋值”这句话表意不明
相关文章:
1. Apache 已经把网站根目录的改为allow from all了,但是服务器还是不能访问?2. gulp-ruby-sass编译出来的文件有错3. 使用 CSS3 的 Media Query 浏览器会加载其他不同分辨率的 css 文件么4. “Webdrivers”可执行文件可能具有错误的权限请参阅https://sites.google.com/a/chromium.org/chromedriver/home5. php-_server-php_self - nginx $_SERVER[’PHP_SELF’] 得到重复路径是什么原因?6. 前端 - 类到底该如何去命名 .newsList 这种的命名难道真的不是过度语义化吗?~7. 数据挖掘 - 如何用python实现《多社交网络的影响力最大化问题分析》中的算法?8. node.js通过module.exprots返回的是promise对象而非data?9. html - 开发android的调取我web页面 他之前用的是收费的浏览器包 显示是全的换了免费的浏览器包后 显示就不全 是什么原因啊10. javascript - 给js写的盒子添加css样式,css样式没起作用。

网公网安备