迭代通过std队列

问题描述:

我试图使用BOOST_FOREACH迭代通过std ::队列。但是,是不是在这个类的原因迭代器我有一个错误:迭代通过std队列

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

可能的重复:http://*.com/questions/1259099/ – 2010-06-01 14:39:47

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

默认情况下,队列内部使用deque。这是一个只公开队列操作的包装器(因此为什么不能迭代它)。我回过头问了一个similar question,最好的答案让我很好地洞察了std::queue的真实用途。一个应该使用std::queue不是因为需要一个队列,而是为了明确只有队列类操作在给定的数据结构上是合法的。这听起来像你需要更多的*,所以去与deque,列表或其他结构与O(1)插入和删除两端。

+0

我认为queue比deque更简单(perf + mem)。但是,在你的答案(并通过头文件验证)后,我认为无论是队列还是双队列,perf和memory都没有区别,除了Queue情况下对某些操作的限制。 – Makesh 2017-02-23 07:32:07

可以使用 的std ::清单,push_front和pop_back

std::queue是一个容器适配器。它使用std::deque作为默认的基础容器。访问这个容器是不可能的,因此不以任何方式迭代。

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