2011-02-08 20 views
6

Bu yüzden, şimdi C-4.6 kullanarak yeni C++ kullanmaya başladım. Diziler ve vektörler üzerinde yinelemek için bu gerçekten güzel buldum.C++ Aralık aralığı için döngü aralığı tabanlı (int i ;;) döngü döngülerini değiştirmenin 0x yolu

for(int& i : std::range(min, max)) {}

gibi bir şeyle standart

for(int i = min; i < max; i++) {}

değiştirmek için bu kullanmak için bir yol olup olmadığını merak ettim ağırlıklı estetik nedenlerle

orada doğal yerleşik şey mi Bunu yapmamı sağlayan yeni C++ standardı? Yoksa kendi menzil/yineleyici sınıfımı mı yazmalıyım?

+0

Kopyala: http://stackoverflow.com/questions/1977339/c-range-xrange-equivalent-in-stl-or-boost – AFoglia

+0

olası yinelenen [C++ 11'de kullanım için bir sınıf sınıfı var mı döngüler için temel aralığı?] (http://stackoverflow.com/questions/7185437/is-there-a-range-class-in-c11-for-use-with-range-based-for-loops) –

cevap

4

Hiçbir yerde göremiyorum. Ama oldukça önemsiz olacaktır:

class range_iterator : public std::input_iterator<int, int> { 
    int x; 
public: 
    range_iterator() {} 
    range_iterator(int x) : x(x) {} 
    range_iterator &operator++() { ++x; return *this; } 
    bool operator==(const range_iterator &r) const { return x == r.x; } 
    int operator*() const { return x; } 
}; 
std::pair<range_iterator, range_iterator> range(int a, int b) { 
    return std::make_pair(range_iterator(a), range_iterator(b)); 
} 

hile yapmak gerekir (başımın üstü kapalı; biraz verdiği gerekebilir). Yineleyici çifti zaten aralık olmalıdır, bu yüzden başlamanızı tanımlamanıza ve kendiniz sonlandırmanıza gerek olmaması gerektiğine inanıyorum.

+0

Aynı zamanda "Tamsayı" türü üzerinde şablon yapmak. –

+0

@Matthieu Evet, tabi. Yukarıda kopyalandığı belirtilen diğer soru daha gelişmiş uygulamalara sahiptir. –