我有一个名为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/

    10-11 22:43
    查看更多