我正在尝试使用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> >’
我需要的结构如下:第一个来,第一个消失。
答案 0 :(得分:19)
std::deque
支持在数据结构的开头和结尾有效插入和删除。您可以使用push_back
和pop_front
手动执行队列操作。
默认情况下,队列在内部使用deque。它是一个只暴露队列操作的包装器(因此你不能迭代它)。我问了similar question一段时间,最好的答案让我很好地了解了std::queue
的真实用法。应该使用std::queue
不是因为需要一个队列,而是要清楚地表明只有类似队列的操作在给定的数据结构上是合法的。听起来你需要更多的自由,所以请使用deque,list或其他结构,使用O(1)插入并在两端移除。
答案 1 :(得分:4)
答案 2 :(得分:1)
std::queue
是容器适配器。它使用std::deque
作为默认底层容器。无法访问此容器,因此不会以任何方式进行迭代。
最好的方法是使用std::deque
或std::list
并自行管理队列行为。可能会在它周围提供你自己的包装。