Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中,什么是运行队列的有效方法+;_C++_Queue - Fatal编程技术网

C++ 在c+中,什么是运行队列的有效方法+;

C++ 在c+中,什么是运行队列的有效方法+;,c++,queue,C++,Queue,虽然我读了很多关于队列接口的书,但我只能访问队列后面和前面的元素 我的问题: 在添加新元素之前,我想检查队列中是否存在“相同元素” 我的第一个解决方案是使用for循环,运行队列迭代的大小,每次检查元素是否存在于队列前面,如果存在,则“升起一个标志”。 在任何情况下,元素被弹出并推到队列的后面,并且在任何情况下,将执行相同次数的迭代 缺点是,即使立即找到元素,for循环也会继续运行 为此,我想使用队列,因为在使用它们时,我必须首先弹出最旧的元素 还有其他更有效的方法吗 谢谢deque可以满足您的要

虽然我读了很多关于队列接口的书,但我只能访问队列后面和前面的元素

我的问题:

在添加新元素之前,我想检查队列中是否存在“相同元素”

我的第一个解决方案是使用for循环,运行队列迭代的大小,每次检查元素是否存在于队列前面,如果存在,则“升起一个标志”。 在任何情况下,元素被弹出并推到队列的后面,并且在任何情况下,将执行相同次数的迭代

缺点是,即使立即找到元素,for循环也会继续运行

为此,我想使用队列,因为在使用它们时,我必须首先弹出最旧的元素

还有其他更有效的方法吗


谢谢

deque可以满足您的要求,因为它允许对元素进行随机访问。它可以通过添加从后面弹出的内容以及迭代所有元素来完成队列所能完成的一切

如果确实必须使用队列,则可以使用虚拟对象或保留列表中第一项的引用,并在再次到达时停止,但这两种解决方案都相当粗糙。根据您想要的用例判断,队列不是您所需要的。

编辑:

因为您可以使用此选项:

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();
    }
};
模板
可结构化_队列:public std::queue
{
类型定义容器\u类型控制;
typename Cont::迭代器begin()
{
返回c.begin();
}
typename Cont::const_迭代器begin()const
{
返回c.begin();
}
typename Cont::迭代器结束()
{
返回c.end();
}
typename Cont::const_迭代器end()const
{
返回c.end();
}
};

现在,每次插入队列时,都要迭代所有元素,这相当耗时。Enqueue()的时间复杂度从O(1)增加到O(n)


如果您可以牺牲一些内存(基于数据的规模),那么您可以在队列中维护一个哈希表。每次插入内容时,首先检查是否在哈希表中。如果是,则同时插入哈希表和队列。执行Dequeue()操作时,也要删除哈希表中的元素。这样,排队和出列的时间复杂度仍然是O(1)。但正如我所说的,你使用额外的内存来获得

为此,我必须使用队列。
按照您编写的内容,我不确定您是否应该这样做。没有神奇的方法来检查
std::queue
的元素。理想情况下,在添加元素时检查它们,或者使用不同的容器(我知道你说你不能)。@Galik:事实上。但是您不想这样做。在可能的情况下,Op使用标准的
std::queue
适配器类,它默认使用
std:deque
作为底层序列容器。如果deque中的页面超过一页,那么这种逻辑将严重失败。简而言之,不要这样做。
std::queue
不能保证将所有对象存储在连续内存中,它可能使用了
std::list
,因此显示的代码是UB。如果您确实想这样做,那么您可以通过受保护的成员
queue::c
,访问容器,没有这些可怕的铸型的未定义的行为。但也不要这样做。首先使用一个更合适的容器。在这个编辑过的版本中,您将队列强制转换为其基础类型。如果基础类型不是队列的第一个成员,则此操作无效。std::queue的第一个元素可能是int。代码将该int强制转换到容器中并尝试访问它。