尽管我读到有关Queue接口的信息,但我只能访问队列后面和前面的元素。
我的问题:
我想检查"相同的元素"在我添加一个新队列之前,它存在于队列中。
我的第一个解决方案是使用for循环,运行SIZE_OF_QUEUE迭代,每次检查元素是否存在于队列的前面并且"引发标记"如果是的话。 在任何情况下,元素都是poped并推送到队列的后面,并且在任何情况下都将执行相同数量的迭代。
缺点是即使立即找到元素,for循环也会继续运行。
我想为此目的使用队列,因为我必须在使用它时首先弹出最旧的元素。
还有其他方法可以更有效地完成吗?
谢谢
答案 0 :(得分:3)
deque可以做你需要的,因为它允许随机访问元素。它可以通过从后面添加弹出以及遍历所有元素来完成队列可以执行的所有操作。
如果你真的必须使用一个队列,你可以使用一个虚拟对象或保留列表中第一个项目的引用,当你再次到达它时停止,但这两个解决方案都相当hacky。根据您所需的用例判断,队列并不是您所需要的。
答案 1 :(得分:0)
编辑:
,因为accessing elements in a deque by offsetting a pointer to another element causes undefined behavior你可以改用:
template<typename T>
struct iterable_queue : public std::queue<T>
{
typedef container_type Cont;
typename Cont::iterator begin()
{
return c.begin();
}
typename Cont::const_iterator begin() const
{
return c.begin();
}
typename Cont::iterator end()
{
return c.end();
}
typename Cont::const_iterator end() const
{
return c.end();
}
};
答案 2 :(得分:0)
现在每次插入队列时,都会迭代所有元素,这非常耗时。 Enqueue()的时间复杂度从O(1)上升到O(n)。
如果您可以牺牲一些内存(基于数据的规模),您可以使用队列维护哈希表。每次插入内容时,首先要检查是否在哈希表中。如果是这样,请插入哈希表和队列。当你执行Dequeue()时,也删除哈希表中的元素。这样,Enqueue和Dequeue的时间复杂度仍为O(1)。但正如我所说,你使用额外的内存来获得收益。