遍历标准队列(std queue)

8

我正在尝试使用BOOST_FOREACH遍历std::queue。但是由于该类中没有迭代器,因此出现错误:

std::queue<std::string> someList;
BOOST_FOREACH(std::string temp, someList)
{
   std::cout << temp;
}

>no matching function for call to begin(...)
>no type named ‘iterator’ in ‘class std::queue<std::basic_string<char> >’

我需要的结构是:先来的先离开。

1
可能是重复问题:https://dev59.com/ynM_5IYBdhLWcg3wt1k0 - CB Bailey
3个回答

19

std::deque支持在数据结构的开头和结尾进行高效的插入和删除操作。您可以使用push_backpop_front手动执行队列操作。

默认情况下,队列内部使用双端队列。它是一个封装器,仅公开队列操作(因此您无法对其进行迭代)。我之前曾经提过一个类似的问题,最佳答案为我提供了有关std::queue的实际用途的深刻见解。使用std::queue不是因为需要队列,而是为了明确表明给定数据结构上只允许进行队列操作。看起来您需要比这更多的自由,因此请使用双端队列、列表或其他具有O(1)在两端进行插入和删除的结构。


我曾认为队列比双端队列更简单(在性能和内存方面)。但是在看到你的回答后(并通过头文件验证),我认为无论是队列还是双端队列,在性能和内存方面都没有区别,除了在队列的某些操作上有一些限制。 - Makesh

4

你可以使用std::list来进行push_front和pop_back操作


1

std::queue 是一个容器适配器。它使用 std::deque 作为默认的底层容器。无法访问该容器,因此也无法以任何方式进行迭代。

最好的方法是使用 std::dequestd::list 并自行管理队列行为。可能需要提供自己的包装器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接