Thắc mắc về cách implement Iterator trong C++

E đọc về cách cài đặt lại iterator thì thấy có 2 kiểu làm chính như sau:
1/

template <typename T>
class MyContainer
{
    public:
        typedef int size_type;
        class iterator
        {
            public:
                typedef iterator self_type;
                typedef T value_type;
                typedef T& reference;
                typedef T* pointer;
                typedef std::forward_iterator_tag iterator_category;
                typedef int difference_type;
                iterator(pointer ptr) : ptr_(ptr) { }
                self_type operator++() { self_type i = *this; ptr_++; return i; }
                self_type operator++(int junk) { ptr_++; return *this; }
                reference operator*() { return *ptr_; }
                pointer operator->() { return ptr_; }
                bool operator==(const self_type& rhs) { return ptr_ == rhs.ptr_; }
                bool operator!=(const self_type& rhs) { return ptr_ != rhs.ptr_; }
            private:
                pointer ptr_;
        };
// implement method ...
        iterator begin() return iterator(data_);
        iterator end() return iterator(data_ + size_);
  
    private:
        T* data_;
        size_type size_;
};

2/

template<class T>
class myIterator : public std::iterator<std::forward_iterator_tag, T>
{
// định nghĩa các operator
};

A/c cho e hỏi trong kiểu thứ 2, việc kế thừa này để làm gì ạ? Vì trong std::iterator e chỉ thấy như kiểu nó là 1 interface để myIterator tuân theo chứ ngoài ra ko còn mục đích gì khác!
Có phải những container như vector ,… cũng có 1 nested class iterator bên trong như kiểu 1 phía trên phải không ạ? Với lại iterator_traits là để làm gì v ạ? e đã tìm hiểu r nhưng vẫn ko hiểu lắm!

2 Likes

kiểu thứ 2 đã bị deprecated rồi, ko xài nữa. C++20 hình như loại bỏ hoàn toàn cách 2 luôn :V

5 Likes

còn iterator_traits để làm gì vậy a?

https://en.cppreference.com/w/cpp/iterator/iterator_traits

là để tạo interface iterator chung cho kiểu iterator và kiểu pointer thôi em :V

ví dụ em define 1 class MyIterator thì em define kiểu value_type trong nó để biết khi gọi *myIterator nó ra kiểu dữ liệu gì, em viết thuật toán có thể gọi MyIterator::value_type value = *myIterator;. Nhưng raw pointer ví dụ int* thì làm gì có kiểu int*::value_type mà gọi :V Raw pointer cũng là valid iterator, nhưng chả lẽ vì ko có value_type nên ko xài như iterator được?

để xài pointer như iterator người ta tạo iterator_traits để gọi iterator_traits<int*>::value_type nó sẽ trả về int, còn khi gọi iterator_traits<MyIterator>::value_type thì nó trả về MyIterator::value_type. Khi em viết template code iterator_traits<T>::value_type thì em chả cần biết T là pointer hay kiểu iter gì hết, em chỉ biết T có interface của iterator, lấy interface đó mà xài, khỏe.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?