gpt4 book ai didi

c++ - 为什么不能将反向迭代器转换为正向迭代器?

转载 作者:可可西里 更新时间:2023-11-01 15:03:52 26 4
gpt4 key购买 nike

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

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() 给出了一个正向迭代器,它是反向迭代器取消引用的值的下一个。 This is because a reverse iterator physically points to the element after the one it logically points to .因此,要使正向迭代器与您的 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';
}

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

关于c++ - 为什么不能将反向迭代器转换为正向迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4407985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com