4

我最近想知道 c++11 中基于范围的 for 循环的要求是什么,因为我只见过预期用法的示例:

for (auto person : people)
{
  cout << person.name << endl;
}

但是鉴于容器只需要具有开始和结束方法,而根本不需要包含任何内容,那么以下内容是否会被视为“不好的做法”?如果不出意外,如果有人在面试中要求您提供斐波那契数列,这是一个新鲜的答案!

#include <string>
#include <iostream>
#include <Windows.h>

using namespace std;

struct FibItr
{
    FibItr(int cur = 1, int prev = 0) : mCur(cur), mPrev(prev) {}
    FibItr & operator++()
    {
        mCur += mPrev;
        mPrev = mCur - mPrev;
        return *this;
    }

    int operator*(){ return mCur; }

    bool operator!=(const FibItr & _rhs)
    {
        return mCur != _rhs.mCur || mPrev != _rhs.mPrev;
    }   

    unsigned int mCur, mPrev;
};

struct Fib
{
    FibItr begin() { return FibItr(); }
    FibItr end() { return FibItr(0, 0); }
};

int main( int argc, char* argv[] ) 
{   
    for (auto num : Fib())
    {
        cout << num << endl;
        Sleep(500);
    }

    return 0;
}
4

1 回答 1

3

问题不是真正的问题,auto for-loop而是实现更奇怪的迭代器是否合理。虽然有一些极端情况,但您可以为将某些操作实现为迭代器(memoized fibonacci 就是一个很好的例子)提出一个完美的好论据。

有整个库致力于将迭代器转换为更多内容,因此其他一些人也认为这是一个好主意。

顺便说一句:实现迭代器是一项棘手的工作,这就是为什么要小心使用此类方法的原因。Boost.Iterator是一组很好的助手,可以让这更容易。

于 2012-11-19T16:21:44.837 回答