好吧,我知道为什么,这是因为没有转换,但为什么没有转换呢?为什么转发迭代器可以转向反转迭代器而不是反过来呢?更重要的是,如果我想这样做,我该怎么办?是否有一些适配器允许您使用前向迭代器向后迭代?
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)构造函数的行为不同.
| 归档时间: |
|
| 查看次数: |
10779 次 |
| 最近记录: |