为什么我不能将反向迭代器转换为前向迭代器? [英] Why can I not convert a reverse iterator to a forward iterator?
问题描述
嗯,我知道为什么,因为没有转换,但为什么没有转换?为什么可以转发迭代器转向反向迭代器,但不是反过来?更重要的是,如果我想这样做,我该怎么办?是否有一些适配器允许您使用向前迭代器向后迭代?
Well, I know why, it's because there isn't a conversion, but why isn't there a conversion? Why can forward iterators be turned to reverse iterators but not the other way round? And more importantly, what can I do if I want to do this? Is there some adapter that allows you to iterate backwards using a forward 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
推荐答案
。 reverse_iterator
的一个特殊性是 base()
给出了一个向前迭代器,它是从反向迭代器取消引用至。 这是因为反向迭代器实际上指向之后的元素 / em>指向 。因此,要使向前迭代器与您的reverse_iterator具有相同的项目,您需要将 base()
的结果减1,或您可以先增加反向迭代器 ,然后选择 .base()
。
You could write a helper function. One particularity of reverse_iterator
is that base()
gives a forward iterator that is next from the value that the reverse iterator dereferences to. This is because a reverse iterator physically points to the element after the one it logically points to. So to have the forward iterator to the same item as your reverse_iterator, you'll need to decrement the result of base()
by one, or you could increment the reverse iterator first, then take the .base()
of that.
这两个示例如下所示:
#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';
}
警告:此行为与 reverse_iterator(iterator)
构造函数。
Warning: this behavior is different from that of the reverse_iterator(iterator)
constructor.
这篇关于为什么我不能将反向迭代器转换为前向迭代器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!