这是使用基于范围的循环的合理方法吗?

时间:2012-11-19 16:16:52

标签: c++ c++11

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

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

1 个答案:

答案 0 :(得分:3)

问题不在于auto for-loop,而在于实现奇怪的迭代器是否合理。虽然有角落案例,但你可以作为迭代器实现一些操作(memoized fibonacci就是一个很好的例子)。

整个图书馆都致力于将迭代器转化为更多,所以其他人也认为这是一个好主意。

顺便说一句:实现迭代器是一件棘手的事情,这就是为什么这样的方法应该谨慎使用的原因。 Boost.Iterator是一组很好的助手,可以使这更容易。