2013-05-17 4 views
13

私はそのようなコード持っている(ベクター中に残留:0 1 2 3 4)。 ここで.base()は何をしますか?C++ STL)は

+0

おそらく、これをお読みください:http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL

答えて

22

base()フォワード対応イテレータに逆反復子を変換します。しかし、その単純さにもかかわらず、この対応は、あるものと同じくらい些細なものではありません。

リバースイテレータポイント一つの要素で、それは以前のものを間接参照し、それ物理点および要素が論理点に要素が異なります。次の図では、iは前方イテレータであり、そしてriiから構成リバースイテレータである:論理素子2を指す

       i, *i 
          | 
    -  0  1  2  3  4  - 
         |  | 
         *ri ri 

したがってri場合、それは物理的要素3を指します。したがって、順方向イテレータに変換すると、結果のイテレータは、3という要素を指します。これは、あなたの例では削除されます。

次の小さなプログラムは、上記の動作を示しています。ここ

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

int main(int argc, char *argv[]) 
{ 
    std::vector<int> v { 0, 1, 2, 3, 4 }; 
    auto i = find(begin(v), end(v), 2); 

    std::cout << *i << std::endl; // PRINTS 2 

    std::reverse_iterator<decltype(i)> ri(i); 
    std::cout << *ri << std::endl; // PRINTS 1 
} 

live exampleです。

8

base()は、基になる基本イテレータを返します。

ベース反復子は要素の隣にある要素を指す reverse_iteratorが現在指しています。つまり、 std::reverse_iterator(it).base() == std::next(it)です。

あなたはreverse_iteratorhereについての詳細を学ぶことができます。

enter image description here