为什么我不能将反向迭代器转换为前向迭代器?

Ben*_*ers 11 c++ iterator

好吧,我知道为什么,这是因为没有转换,但为什么没有转换呢?为什么转发迭代器可以转向反转迭代器而不是反过来呢?更重要的是,如果我想这样做,我该怎么办?是否有一些适配器允许您使用前向迭代器向后迭代?

std::vector<int> buffer(10);
std::vector<int>::iterator forward = buffer.begin();
std::vector<int>::reverse_iterator backward = buffer.rbegin();
++forward;
++backward;
std::vector<int>::iterator forwardFromBackward = std::vector<int>::iterator(backward); // error! Can't convert from reverse_iterator to iterator!
std::vector<int>::reverse_iterator backwardFromForward = std::vector<int>::reverse_iterator(forward); // this is fine
Run Code Online (Sandbox Code Playgroud)

vis*_*tor 17

你可以写一个辅助函数.一个特殊之处reverse_iterator在于,它base()提供了一个前向迭代器,它是反向迭代器取消引用的值的下一个.这是因为一个反向迭代物理指向元素之后它的一个逻辑地指向.所以有前向迭代到同一项目作为你的reverse_iterator的,你需要减的结果base()通过一个,或者你可以递增反向迭代第一,然后取.base()这一点.

两个例子如下所示:

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

//result is undefined if passed container.rend()
template <class ReverseIterator>
typename ReverseIterator::iterator_type make_forward(ReverseIterator rit)
{
    return --(rit.base()); // move result of .base() back by one.
    // alternatively
    // return (++rit).base() ;
    // or
    // return (rit+1).base().
}

int main()
{
    std::vector<int> vec(1, 1);
    std::vector<int>::reverse_iterator rit = vec.rbegin();
    std::vector<int>::iterator fit = make_forward(rit);
    std::cout << *fit << ' ' << *rit << '\n';
} 
Run Code Online (Sandbox Code Playgroud)

警告:此行为与reverse_iterator(iterator)构造函数的行为不同.