std ::队列迭代

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

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

那么我能以某种方式进入队列的底层deque并迭代它吗?

如果你需要遍历一个queue那么你需要的不仅仅是一个队列。 标准容器适配器的要点是提供一个最小的接口。 如果你还需要做迭代,为什么不直接使用deque(或者list)呢?

虽然我同意其他人的观点,直接使用可迭代容器是首选解决scheme,但我想指出的是,C ++标准可以保证为自己动手的解决scheme提供足够的支持,以防出于任何原因而需要它。

也就是说,您可以从std::queueinheritance,并使用其受保护的成员Container c; 访问底层容器的begin()和end()(假设这些方法在那里存在)。 这里是一个在VS 2010中运行并且使用ideonetesting的例子 :

 #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; } 

您可以将原始队列保存到临时队列中。 然后,你只需在临时队列上正常popup来通过原始队列,例如:

 queue tmp_q = original_q; //copy the original queue to the temporary queue while (!tmp_q.empty()) { q_element = tmp_q.top(); std::cout << q_element <<"\n"; tmp_q.pop(); } 

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

如果您需要迭代队列…队列不是您需要的容器。
你为什么select一个队列?
你为什么不带一个你可以迭代的容器?


1.如果你select一个队列,那么你说你想包装容器到一个“队列”界面: – 前 – 后 – 推 – stream行 – …

如果您还想迭代,则队列的接口不正确。 队列是提供原始容器的受限子集的适配器

2.队列的定义是一个FIFO,根据定义,FIFO是不可迭代的

为什么不直接复制要迭代的队列,并且一次删除一个项目,随时打印它们? 如果您想在迭代中更多地使用元素,那么队列就是错误的数据结构。

总之:没有一个黑客,使用vector作为底层容器,所以queue :: front将返回有效的引用,将其转换为迭代指针直到<= queue :: back

std :: queue是一个容器适配器,你可以指定使用的容器(默认使用deque)。 如果您需要在适配器之外的function,那么只需直接使用双端队列或其他容器。