首頁  >  問答  >  主體

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赋值?

PHP中文网PHP中文网2763 天前798

全部回覆(2)我來回復

  • PHPz

    PHPz2017-04-18 10:49:50

    問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;

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:49:50

    1. 什麼叫兩個數值。 。 reverse_iteratoriterator是迭代器,實質是兩個類別模板​​
      透過在類別的內部重新實作函數的不同細節來實現不同功能,但對外介面一致

    2. 實例化一個物件out_iter,类型是ostream_iterator<int,char>,传入构造函数的参数是cout" "

    「cout能給int賦值」這句話表意不明

    回覆
    0
  • 取消回覆