Tôi đang cố gắng triển khai bộ chuyển đổi vòng lặp ngược cho các lớp iterator và const_iterator của mình nhưng tôi gặp một số sự cố. Nếu bất cứ ai có thể hướng dẫn tôi giải quyết vấn đề này, nó sẽ được đánh giá rất cao!
Ý tưởng là tôi có thể tạo một trình vòng lặp ngược từ các lệnh gọi hàm rbegin() và rend() của mình
Reverse_iterator rbegin();
Reverse_iterator rend();
const_reverse_iterator rbegin() const;
const_reverse_iterator rend() const;
Tôi đang sử dụng typedef sau trong lớp:
trình vòng lặp typedef btree_iterator;
typedef const_btree_iterator const_iterator;
typedef Reverse_btree_iterator Reverse_iterator;
typedef Reverse_btree_iterator const_reverse_iterator;
Như bạn có thể thấy, tôi muốn có thể tạo một trình vòng lặp ngược bằng cách sử dụng một mẫu, cung cấp một trình vòng lặp hoặc một const_iterator cho lớp Reverse_iterator.
Thật không may, tôi bị mắc kẹt vào thời điểm này ...
Dưới đây là định nghĩa lớp hiện tại của tôi, có lỗi.
mẫu lớp đảo ngược_btree_iterator {
typedef ptrdiff_t Difference_type;
typedef bidirectional_iterator_tag iterator_category;
public:
Reverse_btree_iterator() : base_(I()) {}
mẫu Reverse_btree_iterator(const btree_iterator& rhs): base_(rhs) {}
Tôi base() { return base_ }
I::toán tử tham chiếu*() const;
I::toán tử con trỏ->() const;
I& toán tử++();
Tôi toán tử++(int);
Toán tử I&--();
Tôi toán tử--(int);
toán tử bool==(const I& other) const;
toán tử bool!=(const I& other) const;
private:
Tôi căn cứ_;
};
Tôi chưa bao giờ sử dụng các mẫu như thế này trước đây, vì vậy rất có thể tôi đã hoàn toàn hiểu sai cách chúng được sử dụng...
Vì tôi có thể là một iterator hoặc const_iterator, nên các định nghĩa kiểu cho tham chiếu và con trỏ khác nhau giữa hai lớp. Dòng chưa được biên dịch là:
I::toán tử tham chiếu*() const;
I::toán tử con trỏ->() const;
Nếu tôi không thể thực hiện I::reference và I::pointer, tôi không chắc mình có thể làm cách nào khác để làm cho lớp Reverse_iterator hoạt động cho cả iterator và const_iterators. Tôi cũng đã thử thêm các mẫu vào phía trước chúng vì chúng được định nghĩa trong lớp lặp là (ví dụ):
con trỏ typedef T*;
typedef T& tham chiếu;
tham chiếu và con trỏ là tên phụ, vì vậy bạn phải sử dụng
tên kiểu I::reference operator*() const;
tên kiểu I::pointer operator->() const;
Hơn nữa, hàm tạo chỉ nên chấp nhậnI
.
Tuy nhiên, không cần thiết phải viết lớp này. Thư viện chuẩn có đảo ngược_iteratorvì điều này. Hoặc, nếu bạn không hài lòng với điều đó, cũng có Boost.ReverseIterator .
Chỉ cần
typedef std::reverse_iterator đảo_iterator;
typedef std::reverse_iterator const_reverse_iterator;
Tôi là một lập trình viên xuất sắc, rất giỏi!