簡體   English   中英

圓形數組(隊列)迭代器

[英]Circular array (Queue) Iterator

我有一個隊列的迭代器類(實現為循環數組)。 我附上下面的代碼。 問題出在++運算符。 一旦到達數組的末尾,它就會循環回到其開頭,因此迭代器指向第一個元素。 它工作正常,但是我無法使用此方法實現end()迭代器。 返回隊列類內部的begin()和end()迭代器的函數可以在底部看到。 end()迭代器應指向隊列的尾部,但是當數組已滿並且尾部等於數組的大小不起作用時,++運算符將向后循環,而不是允許其返回真實的結尾(),即后方指向的元素。 關於這個問題有什么建議嗎?

class IteratorForwQueue : std::iterator<std::forward_iterator_tag, P*> {
    public:
        typedef IteratorForwQueue iter;
        IteratorForwQueue(P* e, Queue* q) : elem(e), _queue(q) {}
        IteratorForwQueue(const IteratorForwQueue& it, Queue* q) :
            elem(it.elem), _queue(q) {}

        iter& operator++() {
            if(elem >= (_queue->_elems + (_queue->_size - 1)) &&
                            _queue->_rear != _queue->_size)
                elem = &(_queue->_elems[0]); // circle back passed the array
            else
                ++elem;
            return *this;
        }

        P& operator*() { return *elem;}
        P* operator->() { return elem; }
        bool operator==(const iter& it) { return elem == it.elem; }
        bool operator==(const P& e) { return e == *elem; }
        bool operator!=(const iter& it) { return elem != it.elem; }
        bool operator!=(const P& e) { return e != *elem; }
    private:
        P* elem;
        Queue<P>* _queue;
    }; // end of iterator class
// ....
IteratorForwQueue begin() { return IteratorForwQueue(_elems + _front, this); }
IteratorForwQueue end() { return IteratorForwQueue(_elems + _rear, this); }

怎么樣呢,基於end不必一定是“ past-the-end”迭代器的想法,它可以是任何東西:

class IteratorForwQueue : std::iterator<std::forward_iterator_tag, P*> {
public:
    typedef IteratorForwQueue iter;
    IteratorForwQueue(P* e, size_t sz, size_t rear) : elem(e), _base(e), _sz(sz), _rear(rear) {}
    IteratorForwQueue(const IteratorForwQueue& it, size_t sz) :
        elem(it.elem), _base(it.elem), _sz(sz) {}

    iter& operator++() {
       if(elem - _base == _rear) {
          elem = nullptr;
          _base = 0;
          _sz = 0;
          _rear = 0;
          return *this;
       } 
       if(elem >= _base + (_sz - 1))
            elem = _base; // circle back passed the array
        else
            ++elem;


        return *this;
    }

    P& operator*() { return *elem;}
    P* operator->() { return elem; }
    bool operator==(const iter& it) { return elem == it.elem; }
    bool operator==(const P& e) { return e == *elem; }
    bool operator!=(const iter& it) { return elem != it.elem; }
    bool operator!=(const P& e) { return e != *elem; }
private:
    P* elem;
    P* _base;  // can't access members of outer class
    size_t _sz; // can't access members of outer class
    size_t _rear;
}; // end of iterator class
// ....
IteratorForwQueue begin() { return IteratorForwQueue(_elems + _front, _size, _rear); }
IteratorForwQueue end() { return IteratorForwQueue(nullptr, 0, 0); }
const IteratorForwQueue cbegin() const { return     IteratorForwQueue(_elems + _front, _size); }
const IteratorForwQueue cend() const { return IteratorForwQueue(_elems + _rear, _size); }

順便說一句,最好有一個指向原始數據結構的指針,使迭代器成為好友類,並_rear獲取_base_sz_rear

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM