2011-02-08 77 views
6

Vì vậy, tôi đã tham gia vào C++ mới bằng cách sử dụng GCC 4.6 hiện có phạm vi cho vòng lặp. Tôi đã tìm thấy điều này thực sự tốt đẹp cho iterating qua mảng và vectơ.Cách C++ 0x để thay thế cho vòng lặp (int i ;;) với phạm vi dựa trên vòng lặp

Vì những lý do chủ yếu là thẩm mỹ Tôi tự hỏi nếu có một cách để sử dụng để thay thế các tiêu chuẩn

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

với một cái gì đó giống như

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

Có một cái gì đó tự nhiên được xây dựng vào chuẩn C++ mới cho phép tôi làm điều này? Hay tôi phải viết lớp phạm vi/vòng lặp của riêng mình?

+0

Trùng lặp: http://stackoverflow.com/questions/1977339/c-range-xrange-equivalent-in-stl-or-boost – AFoglia

+0

có thể trùng lặp của [Có một phạm vi lớp trong C++ 11 để sử dụng với phạm vi dựa trên các vòng?] (http://stackoverflow.com/questions/7185437/is-there-a-range-class-in-c11-for-use-with-range-based-for-loops) –

Trả lời

4

Tôi không thấy ở bất cứ đâu. Nhưng nó sẽ là khá tầm thường:

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

nên làm các trick (ngoài đỉnh đầu của tôi; có thể cần một chút tinh chỉnh). Cặp các trình vòng lặp nên đã là phạm vi, vì vậy tôi tin rằng bạn không cần phải xác định bắt đầu và kết thúc chính mình.

+0

Bạn có thể cũng làm cho nó mẫu trên kiểu 'Integer'. –

+0

@Matthieu Vâng, chắc chắn rồi. Câu hỏi khác được đề cập là trùng lặp ở trên có một số triển khai nâng cao hơn. –

Các vấn đề liên quan