2011-10-21 41 views
7

Tôi đang cố gắng triển khai bộ điều hợp tuần hoàn ngược cho các lớp lặp và các lớp const_iterator của mình với một chút rắc rối. Nếu bất cứ ai có thể hướng dẫn tôi qua điều này, điều đó sẽ được đánh giá cao!Bộ chuyển đổi reverse_iterator

Ý tưởng là tôi sẽ có thể tạo ra một reverse-iterator từ rbegin của tôi() và Rend() chức năng gọi

reverse_iterator rbegin(); 
reverse_iterator rend(); 
const_reverse_iterator rbegin() const; 
const_reverse_iterator rend() const; 

Tôi đang sử dụng của typedef sau trong lớp:

typedef btree_iterator<T> iterator; 
typedef const_btree_iterator<T> const_iterator; 
typedef reverse_btree_iterator<iterator> reverse_iterator; 
typedef reverse_btree_iterator<const_iterator> const_reverse_iterator; 

Như bạn có thể thấy, tôi muốn có thể tạo các trình vòng lặp ngược bằng cách sử dụng các mẫu, cung cấp lớp reverse_iterator hoặc là một trình lặp hoặc bộ tách.

Thật không may, đó là bit này tôi bị kẹt trên ...

Dưới đây là định nghĩa lớp mà tôi hiện có, có lỗi.

template <typename I> class reverse_btree_iterator { 

    typedef ptrdiff_t      difference_type; 
    typedef bidirectional_iterator_tag iterator_category; 

public: 

    reverse_btree_iterator() : base_(I()) {} 
    template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {} 

    I base() { return base_; } 

    I::reference operator*() const; 
    I::pointer operator->() const; 
    I& operator++(); 
    I operator++(int); 
    I& operator--(); 
    I operator--(int); 
    bool operator==(const I& other) const; 
    bool operator!=(const I& other) const; 

private: 

    I base_; 

}; 

Tôi chưa bao giờ sử dụng các mẫu như thế này trước, vì vậy nó rất có khả năng tôi hoàn toàn hiểu lầm như thế nào họ có thể được sử dụng ...

Kể từ khi tôi có thể là một iterator hoặc một const_iterator, các typedef của tham chiếu và con trỏ khác nhau giữa hai lớp. Các dòng mà không phải biên dịch là những:

I::reference operator*() const; 
I::pointer operator->() const; 

Tôi không chắc chắn làm thế nào khác tôi có thể làm công việc lớp một reverse_iterator cho cả iterator và const_iterator nếu như tôi không thể làm tôi :: tài liệu tham khảo và Tôi :: con trỏ. Tôi cũng đã cố gắng bổ sung thêm mẫu trước đó, kể từ khi chúng được định nghĩa trong lớp iterator (ví dụ) như:

typedef T*       pointer; 
typedef T&       reference; 
+1

+1 cho bản lĩnh. –

+0

Con trỏ/tham chiếu đã định nghĩa là 'const T *' và 'const T &' trong const_iterator mà bạn đang cố gắng điều chỉnh? – gwiazdorrr

+0

'mẫu' khá gần. Đạo cụ. – Puppy

Trả lời

5

tham khảo và con trỏ là tên phụ thuộc, vì vậy bạn phải sử dụng

typename I::reference operator*() const; 
typename I::pointer operator->() const; 

Ngoài ra, hàm tạo nên chỉ chấp nhận I.

Tuy nhiên, không cần phải viết lớp này chút nào. Thư viện chuẩn có reverse_iterator cho việc này. Hoặc nếu bạn không hài lòng với điều đó, cũng có Boost.ReverseIterator.

Tất cả phải mất là chỉ

typedef std::reverse_iterator<iterator> reverse_iterator; 
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 
+1

+1 để trỏ tới stl :: reverse_iterator. Tôi sẽ cho nhiều hơn nếu tôi có thể. – Tomek

1

Bên cạnh đó, bạn quên để cung cấp toán tử so sánh với vòng lặp ngược khác cùng loại. Đây là yêu cầu lặp lại ngược.

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