当前位置: 首页 > 知识库问答 >
问题:

循环数组(队列)迭代器

东门俊民
2023-03-14

我有一个用于队列的迭代器类(实现为循环数组)。我在下面附上代码。问题出在++运算符上。一旦它到达数组的末尾,它就会回到它的开始,因此迭代器会指向第一个元素。它工作得很好,但我没有办法使用这种方法实现then end()迭代器。在队列类中返回begin()和end()迭代器的函数可以在底部看到。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); }

共有1个答案

查飞星
2023-03-14

怎么样,基于这样一个想法,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); }

顺便说一下,最好有一个指向原始datastructure的指针,使迭代器成为一个友类,并根据需要获取_base_sz_freed

 类似资料:
  • 假设我有一个大小为[10]的数组,当该数组被填满时,我想实现一个FIFO结构,而不是它只是填满了,因此无法向数组中添加新的东西,并抛出旧的东西。 例如,如果我有一个包含汽车制造商的字符串数组,当我的数组中有10个制造商时,我希望删除最旧的条目,添加最新的条目,但要考虑kepping FIFO。我如何在这样的方法中实现它:

  • 本节我们探索的主题是迭代与循环。循环通常在计算机编程用用于自动执行重复性任务。 在Python中最常用的迭代形式就是for循环了。for循环允许你迭代出列表中所有的项,迭代出来后你可以做任何你想做的事情。 比如,我们创建了一个列表,并打印出其中所有元素的平方。 >>> for value in [0, 1, 2, 3, 4, 5]: ... print(value * value) ... 0 1

  • 我正在从Sahni的“C语言数据结构基础”中学习数据结构。在使用动态数组的循环队列中,作者提到了以下几点, 假设capacity是循环队列的初始容量,我们必须首先使用realloc增加数组的大小,这将把最大容量元素复制到新的数组中。为了获得正确的循环队列配置,我们必须将右段中的元素(即元素a和B)滑动到数组的右端(参见图3.7.d)。数组加倍和向右滑动一起最多复制2*容量-2个元素。

  • 2.3 循环与遍历 程序的比人肉强大的另一个特性就是可以任劳任怨地重复地做些单调无聊(或有聊)的 工作。本节介绍在 VimL 语言中,如何控制程序,命令其循环地按规则干活。 遍历集合变量 首先介绍的是如何依次访问列表如字典内的所有元素,毕竟在 2.1 节介绍的索引方法只 适于偶尔访问查看某个具体的元素。这里要用到的是for ... in 语法。 例如遍历列表: : let list = [0, 1

  • 下面的代码尝试迭代excel文件,并将数据加载到

  • 循环队列(Circular Queue) 1. 循环队列的概念 1.1 循环队列的定义 为了能够充分地使用数组中的存储空间,克服”假溢出”现象,可以把数组的前端和后端连接起来,形成一个环形的表,即把存储队列元素的表从逻辑上看成一个环,成为循环队列(circular queue)。 1.2 循环队列中各元素的逻辑及存储关系 循环队列的首尾相接,当队头指针front和队尾指针rear进到maxSize