English 中文(简体)
我能否把一个反向的炉子变成一个前导器?
原标题:Can I convert a reverse iterator to a forward iterator?
  • 时间:2010-01-10 17:43:00
  •  标签:
  • c++
  • iterator

我有一个称为“<条码>的行动的栏目,基本上围绕<条码>的字体。

因为我需要背弃“密码>Moves

这一类人认为:

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;
};

<代码>先进功能如下:

void Action::Advance
{
    if( bForward)
        currentfwd++;
    else
        currentbck++;
}

我的问题是,我希望能够找回目前<代码>Move的发射器,而不必问我是否正在向前推进或后退。 也就是说,一个功能恢复一个类型的电梯,但我有两个类型。

我是否应当忘记返回一个炉子,而是回到一个最先提到“<0>/代码>的物体?

最佳回答

页: 1 造成STL设计的那种问题开始。 确实有理由:

  1. Not storing iterators along with containers
  2. Using algorithms that accept arbitrary iterators
  3. Having algorithms evaluate an entire range instead of a single item at a time

我怀疑,你现在看到的是真正问题的冰山角。 我的建议是退一步,而不是问如何处理目前设计的细节,就更一般性地询问你如何重新努力完成,以及如何最好地完成这一结果。

对于那些主要关注所有权问题的人来说,答案是一份完全合格的“证明”。 具体而言,反向导器有一个base(> member to do that。 但是,这些资格有些问题。

表明问题,认为此法是:

#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() << "
";
    std::cout << *numbers.rbegin().base() << "
";
    std::cout << *(numbers.rbegin()+1).base() << "
";

    std::cout << *numbers.rend() << "
";
    std::cout << *numbers.rend().base() << "
";
    std::cout << *(numbers.rend()+1).base() << "
";
}

此时此刻,我的特定机器投入如下:

4
0
4
-1879048016
1
-1879048016

摘要:rbegin( we must Add one before 2007,ing to a forward iterator to have an iterator that s valid -- but with rend(, we must not Add one before 2007,ing to have a valid iterator.

只要你将<代码>X.rbegin(>和X.rend(>)作为通用算法的参数,那么,微量经验显示,转换到转发器往往会产生问题。

然而,归根结底,对于问题的实质(而不是标题),答案与上文给出的大致相同:问题在于试图制造一个把收集工作与一对二的收集者结合起来的物体。 这一问题,与前方和逆向者打交道的全局都是空洞的。

问题回答

反转录器有成员:,其中向相应的转发器发送。 请注意:sn t是指同一物体的探测器,实际上按顺序指下一个物体。 因此,rbegin()end(<>/code>和rend()对应于begin(<>/code>。

因此,如果你想回来,那么你会做这样的事情。

std::deque<Move>::const_iterator Current() const
{
    if (forward)
        return currentfwd;
    else
        return (currentbck+1).base();
}

不过,我更愿意回头来,并概述该类内的所有迭代细节。

在我看来,你实际上在同一个阶层有两种不同的行为。

值得注意的是,你似乎只能以某种顺序背叛你的收集工作,否则,如果你开始处理工作,然后改变<条码>bforward<>条码>的论点,你最终会遇到非常奇怪的情况。

从个人角度讲,我全都是为了揭露这两位主持人(即:前线:<条码>:原始、最终、正文和)。

您还可以回馈一个简单的信使物体:

template <class T>
class Iterator
{
public:
  typedef typename T::reference_type reference_type;

  Iterator(T it, T end) : m_it(it), m_end(end) {}

  operator bool() const { return m_it != m_end; }

  reference_type operator*() const { return *m_it; }

  Iterator& operator++() { ++m_it; return *this; }

private:
  T m_it;
  T m_end;
};

template <class T>
Iterator<T> make_iterator(T it, T end) { return Iterator<T>(it,end); }

然后,你只能回过这个简单目标:

class Action
{
public:
  Action(std::deque<Move> const& d): m_deque(d) {} // const& please

  typedef Iterator< std::deque<Move>::iterator > forward_iterator_type;
  typedef Iterator< std::deque<Move>::reverse_iterator > backward_iterator_type;

  forward_iterator_type forward_iterator()
  {
    return make_iterator(m_deque.begin(), m_deque.end());
  }

  backward_iterator_type backward_iterator()
  {
    return make_iterator(m_deque.rbegin(), m_deque.rend());
  }


private:
  std::deque<Move> m_deque;
};

或者,如果你想在前方和后方之间作出有活力的选择,你就可以使信使成为一个纯粹的虚拟界面,并具有前向和后向的 trav。

但事实上,如果你似乎只使用一个字眼的话,我看不出把《人权法案》摆在前列和向后发者:

或许应该重新思考你们选择集装箱。

通常,你不需要利用逆向变形器来倒退,

currentfwd--

后退,尽管它可能不工作(假定你尝试过),但会que。

你应该真正做的是,把你作为降序的导师,执行你们自己的行动工具。 这就是我会做的事情。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?