为什么我不能将反向迭代器转换为前向迭代器? [英] Why can I not convert a reverse iterator to a forward iterator?

查看:330
本文介绍了为什么我不能将反向迭代器转换为前向迭代器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆