的std ::队列迭代(std::queue iteration)

2019-06-18 07:57发布

我需要遍历std::queue 。 www.cplusplus.com说:

默认情况下,如果用于特定队列类没有指定的容器类,则使用标准容器类模板双端队列。

所以,我可以以某种方式获取到队列的底层双端队列和迭代呢?

Answer 1:

如果您需要遍历一个queue ,那么你需要的东西比一个队列多。 标准集装箱适配器的点是提供一种最小接口。 如果你需要做的迭代,以及,为什么不直接使用双端队列(或列表)来代替?



Answer 2:

虽然我与其他人同意,直接使用可迭代的容器是首选的解决方案,我想指出的是,C ++标准的保证,以防万一做它自己的解决方案的支持不够,你希望它无论出于何种原因。

也就是说,你可以继承std::queue ,并利用其受保护的成员Container c; 访问begin()和端部(下层容器)(提供了这些方法存在有)。 下面是在VS 2010中的工作和一个例子与ideone测试 :

#include <queue>
#include <deque>
#include <iostream>

template<typename T, typename Container=std::deque<T> >
class iterable_queue : public std::queue<T,Container>
{
public:
    typedef typename Container::iterator iterator;
    typedef typename Container::const_iterator const_iterator;

    iterator begin() { return this->c.begin(); }
    iterator end() { return this->c.end(); }
    const_iterator begin() const { return this->c.begin(); }
    const_iterator end() const { return this->c.end(); }
};

int main() {
    iterable_queue<int> int_queue;
    for(int i=0; i<10; ++i)
        int_queue.push(i);
    for(auto it=int_queue.begin(); it!=int_queue.end();++it)
        std::cout << *it << "\n";
    return 0;
}


Answer 3:

你可以在原始队列保存到临时队列。 然后,你只需做你的正常弹出的临时队列要经过原之一,例如:

queue tmp_q = original_q; //copy the original queue to the temporary queue

while (!tmp_q.empty())
{
    q_element = tmp_q.front();
    std::cout << q_element <<"\n";
    tmp_q.pop();
} 

最后,该tmp_q将是空的,但是原来的队列不变。



Answer 4:

为什么不只是让你想遍历,并删除项目一次一个队列的复印,打印他们为你去吗? 如果你想用的元素做更多您迭代,那么队列是错误的数据结构。



Answer 5:

如果您需要遍历队列......队列是不是你所需要的容器。
你为什么选择一个队列?
你为什么不拿,你可以遍历一个容器?


1.如果您选择一个队列,然后你说你想包装容器为“排队”界面: - 前 - 回 - 推 - 流行 - ...

如果你也想迭代,队列有一个不正确的接口。 队列是提供原始容器的受限子集的适配器

队列的定义2.是一个FIFO,并通过定义一个FIFO没有可迭代



Answer 6:

我用这样的事情。 不是很复杂的,但应该工作。

    queue<int> tem; 

    while(!q1.empty()) // q1 is your initial queue. 
    {
        int u = q1.front(); 

        // do what you need to do with this value.  

        q1.pop(); 
        tem.push(u); 
    }


    while(!tem.empty())
    {
        int u = tem.front(); 
        tem.pop(); 
        q1.push(u); // putting it back in our original queue. 
    }

它将工作,因为当你突然从Q1的东西,并将其推入TEM,它成为TEM的第一要素。 那么,到底TEM成为Q1的翻版。



Answer 7:

总之:没有。

有一劈,使用载体作为垫层容器,所以queue::front将返回有效的引用,将其转换为指针的迭代,直到<= queue::back



Answer 8:

std::queue是一个容器适配器,您可以指定使用的容器(默认为使用deque )。 如果您需要在适配超出了功能,那么只使用一个deque或直接在另一容器中。



文章来源: std::queue iteration