我最近想知道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;
}
答案 0 :(得分:3)
问题不在于auto for-loop
,而在于实现奇怪的迭代器是否合理。虽然有角落案例,但你可以作为迭代器实现一些操作(memoized fibonacci就是一个很好的例子)。
整个图书馆都致力于将迭代器转化为更多,所以其他人也认为这是一个好主意。
顺便说一句:实现迭代器是一件棘手的事情,这就是为什么这样的方法应该谨慎使用的原因。 Boost.Iterator是一组很好的助手,可以使这更容易。