C++ std::queue的基于范围的循环

C++ std::queue的基于范围的循环,c++,c++11,queue,C++,C++11,Queue,我试图在我的项目中的std::vector中寻找替代品,我发现std::queue正是我要寻找的 我有很多函数使用基于范围的循环进行迭代,我正在尽可能地维护它 我试图在std::queue中编译一个基于范围的循环,但得到的都是编译错误 错误:对“begin(std::queue&)”的调用没有匹配的函数 std::queue不支持范围基循环吗 我确实尝试了谷歌搜索,但没有找到任何与此相关的主题 更新: 我的编译器是GCC v4.7.1 -std=c++11已启用 下面是错误的测试代码: std:

我试图在我的项目中的
std::vector
中寻找替代品,我发现
std::queue
正是我要寻找的

我有很多函数使用
基于范围的循环
进行迭代,我正在尽可能地维护它

我试图在
std::queue
中编译一个
基于范围的循环
,但得到的都是编译错误

错误:对“begin(std::queue&)”的调用没有匹配的函数

std::queue
不支持范围基循环吗

我确实尝试了
谷歌搜索
,但没有找到任何与此相关的主题

更新:

我的编译器是
GCC v4.7.1

-std=c++11
已启用

下面是错误的测试代码:

std::queue<int> Q;

for (int i = 0;i < 10; ++i)
    Q.push(i);

std::cout << "\nqueue contains: ";
for (auto i : Q)
    std::cout << i << ", ";
std::队列Q;
对于(int i=0;i<10;++i)
Q.push(i);

std::cout答案其实很简单:std::queue
中没有函数
begin()
,也没有任何
std::begin
的重载。你可以看一看


核心问题是
std::queue
不应该被迭代。它的存在是为了满足其他需求。如果您真的需要对其进行迭代,您应该只使用支持迭代且代码对其有效的底层容器(默认情况下
std::deque
)。

尽管
std::queue
不支持迭代,它确实有一个复制构造函数,它允许我们将队列临时副本的内容传输到另一个支持迭代的临时容器(例如
std::vector
std::list
,或者如果使用C++11,
std::forward\u list

这样,虽然它花费了一些运行时开销,但如果能有一个非常方便的方法来迭代一个<代码> STD::队列变量的值,那么你可以考虑直接使用这个结构,但是你可以考虑使用如下模板函数(将它添加到一个适当的头文件中):

#包括
#包括
//返回给定队列的可编辑副本
模板std::列表列表(std::队列qCopy){
std::列表返回列表;
而(!qCopy.empty()){
returnList.push_back(qCopy.front());
qCopy.pop();
}
退货清单;
}
纳入OP的用例:

#包括
int main(){
std::队列Q;
对于(int i=0;i<10;++i)
Q.push(i);

对于将来的问题,您可以尝试在一个在线编译环境中形成您的测试用例,例如,它会立即让您知道您是否有编译器问题mentioned@mr5好的,gcc 4.8.1和clang++3.4在您的示例中都失败了。@Morwenn那么这是无效代码吗?@mr5实际上,
std::queue
没有方法
begin()
。当我告诉你它有效时,我把
std::queue
std::deque
混淆了。很抱歉。我还在等待其他答案,但我想没有比这个更不同的答案了。如果它适合我的需要,我会寻找
std::deque
。谢谢你的解释。请注意
std::queue
只是一个适配器类希希“补充说”这两个函数
push
pop
具有适当的含义。您也可以始终使用底层的
std::deque
,但是您没有这些方便的函数。但是您也可以声明
std::deque
std::queue
;使用
deque
进行迭代,使用
queue
推和弹出很方便。严格来说,它不会“添加”这两个函数用这两个函数替换了整个容器接口。
std::queue
的目的主要是防止用户访问底层容器,而不是按FIFO顺序。从形式上讲,目的是实现一个简单的抽象数据类型,但这相当于缩小接口。也就是说存在
队列
的原因是为了防止用户对其进行迭代。如果您想使用
deque
作为FIFO,除了其他用途外,还可以使用其他功能,只是函数名为
push\u back
pop\u front