我有一个名为Action
的类,它实际上是Move
对象的双端队列的包装。
因为我需要向前和向后遍历Moves
的双端队列,所以我有一个正向迭代器和一个reverse_iterator作为类的成员变量。这样做的原因是因为我需要知道何时我已经超越了双端队列的“末端”,无论是前进还是后退。
该类如下所示:
class Action
{
public:
SetMoves(std::deque<Move> & dmoves) { _moves = dmoves; }
void Advance();
bool Finished()
{
if( bForward )
return (currentfwd==_moves.end());
else
return (currentbck==_moves.rend());
}
private:
std::deque<Move> _moves;
std::deque<Move>::const_iterator currentfwd;
std::deque<Move>::const_reverse_iterator currentbck;
bool bForward;
};
Advance
函数如下:void Action::Advance
{
if( bForward)
currentfwd++;
else
currentbck++;
}
我的问题是,我希望能够检索到当前Move
对象的迭代器,而无需查询我向前还是向后。这意味着一个函数返回一种迭代器,但是我有两种类型。我应该忘记返回迭代器,而是返回对
Move
对象的const引用吗? 最佳答案
这正是促使STL设计开始的问题。确实有以下原因:
我怀疑您现在所看到的或多或少是真正问题的冰山一角。我的建议是退后一步,而不是询问如何处理当前设计的细节,而是提出一个关于您要完成的工作以及如何最好地完成该工作的更一般性的问题。最终结果。
对于那些主要关心标题中的问题的人,答案是完全合格的"is"。特别地,reverse_iterator具有
base()
成员来执行此操作。资格虽然有些问题。演示问题,考虑这样的代码:
#include <iostream>
#include <vector>
#include <iterator>
int main() {
int i[] = { 1, 2, 3, 4};
std::vector<int> numbers(i, i+4);
std::cout << *numbers.rbegin() << "\n";
std::cout << *numbers.rbegin().base() << "\n";
std::cout << *(numbers.rbegin()+1).base() << "\n";
std::cout << *numbers.rend() << "\n";
std::cout << *numbers.rend().base() << "\n";
std::cout << *(numbers.rend()+1).base() << "\n";
}
在我的特定计算机上的特定时刻运行此命令,将产生以下输出:
4
0
4
-1879048016
1
-1879048016
简介:对于
rbegin()
,我们必须在转换为正向迭代器之前获得一个有效的迭代器,但必须添加一个,但对于rend()
,我们必须在转换为一个有效迭代器之前不添加一个。只要将
X.rbegin()
和X.rend()
用作通用算法的参数,就可以了-但是经验表明,转换为正向迭代器通常会导致问题。然而,最后,对于问题的主体(与标题相对),答案几乎与上面给出的一样:问题源于试图创建将集合与几个迭代器组合到该集合中的对象。解决该问题,整个带有正向和反向迭代器的业务将变得毫无意义。
关于c++ - 我可以将反向迭代器转换为正向迭代器吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2037867/