【发布时间】:2019-03-10 03:18:14
【问题描述】:
我有一个用于队列的迭代器类(实现为循环数组)。我附上下面的代码。问题在于 ++ 运算符。一旦它到达数组的末尾,它就会回到它的开头,因此迭代器指向第一个元素。它工作正常,但我无法使用这种方法实现 then 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); }
【问题讨论】:
-
你能负担得起浪费一个插槽并将其用作哨兵吗?
-
队列的前面和后面会随着您入队和出队而变化。如果它发生变化,我不能有一个哨兵
-
那么事情就是这样,如果你有一个队列实现为一个循环数组,你将如何实现它的迭代器的operator++?