2012-11-19 19 views
4

我最近想知道的要求是基於對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

@David爲什麼不呢?因爲發電機是完全合理的,所以總是有「中斷」和無限序列。 –

+1

我會努力讓'FibItr'成爲一個合適的ForwardIterator。一種方法是繼承'std :: iterator'並實現更多方法,如'operator ==','operator->','operator ++(int)'。另一種方法:使用'boost :: iterator_facade'。 – aschepler

回答

3

的問題是不是真的對auto for-loop,但如果它是合理的實施陌生人一種迭代器。雖然有些情況下,你可以將一些操作作爲迭代器來實現一個完美的好參數(memoized斐波那契就是一個很好的例子)。

有一些圖書館專門爲更多的東西轉換迭代器,所以其他一些人也認爲這是一個好主意。

順便說一句:實現一個迭代器是棘手的業務,這就是爲什麼這樣的方法應該小心使用。 Boost.Iterator是一個很好的助手,可以使這更容易。

+0

是的,這是正確的 - 但真的與自動for循環結合。在頂部,我可以想象一組代表數據庫中的表的類,每個類都有一個公共的基類來處理大量的begin()/ end(),然後使用這種類型的模式來更簡潔地獲取數據無論您感興趣的表,文件等,可以根據可選的緩衝區大小控制何時/多少數據加載:'for(auto customer:Customers(100))'然後將從Customers表中讀取100塊 - 看起來非常直觀/簡單。 – Rollie

相關問題