4

私は最近、意図した使用例しか見たことがなかったので、c++ 11 の範囲ベースの for ループの要件が何であるか疑問に思っていました。

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

しかし、コンテナにはbeginメソッドとendメソッドだけが必要で、何も含む必要がないことを考えると、以下は何らかの形で「悪い習慣」と見なされますか? 少なくとも、インタビューでフィボナッチ数列について尋ねられたら、それは新鮮な答えです!

#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見知らぬ種類のイテレータを実装することが合理的かどうかです。コーナーケースはありますが、いくつかの操作をイテレータとして実装するための完璧な議論をすることができます (メモ化されたフィボナッチが良い例です)。

イテレータを別のものに変換することに特化したライブラリ全体があるため、他の人もそれを良い考えだと考えています。

余談ですが、イテレータの実装はトリッキーな作業です。そのため、このようなメソッドは注意して使用する必要があります。Boost.Iteratorは、それを容易にする優れたヘルパーのセットです。

于 2012-11-19T16:21:44.837 に答える