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

标签 c++ c++11

我最近想知道 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;
}

最佳答案

问题不在于auto for-loop,而是实现奇怪的迭代器是否合理。虽然存在极端情况,但您可以为将某些操作实现为迭代器提供完美的论据(内存斐波那契就是一个很好的例子)。

整个库都致力于将迭代器变成更多东西,所以其他一些人也认为这是个好主意。

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

关于c++ - 这是使用基于范围的 for 循环的合理方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457824/

相关文章:

c++ - 停止 C++ 11 std::threads 等待 std::condition_variable

c++ - std::istream 类型是 EqualityComparable 吗?

c++ - GNU Make 分离出一些 cpp 并以不同的方式编译它

c++ - 虚函数表指针的大小是多少?

c++ - Dependency Walker 在函数名称后显示 @x

c++ - 了解 C++ std::shared_ptr

c++ - 智能指针和派生类

c++ - 双指针**src和运算(*(*src)++ = reg_offset)

c++ - 修改虚函数中的基类

c++ - 无论如何将多个if条件与c++模板链接在一起?