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

时间:2013-12-23 11:27:16

标签: c++ c++11 queue

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

我有很多使用range-based loop进行迭代的函数,我试图尽可能地维护它。

我尝试在range-based loop中编译std::queue,但我得到的只是编译错误

  

错误:没有匹配函数来调用'begin(std :: queue&)'

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

我确实尝试了Google search,但没有找到任何与此有关的话题。

更新

我的编译器是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 << ", ";

2 个答案:

答案 0 :(得分:10)

嗯,答案实际上非常简单:begin()中没有函数std::queue,并且std::begin也没有任何重载std::queue。您可以查看documentation

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

答案 1 :(得分:0)

尽管std :: queue不支持迭代,但是它确实具有 copy构造子,它允许我们将队列的临时副本的内容传输到另一个支持迭代的临时容器中(例如std :: vector,std :: list,或者如果使用C ++ 11,则是std :: forward_list)。

因此,尽管这样做的目的是要有一种合理方便的方法来迭代std :: queue的值,但它确实会花费一些运行时开销,并且不如直接迭代结构好。变量,您可以考虑使用如下所示的模板化函数(将其添加到适当的头文件中):

#include <queue>
#include <list>

// returns an iterable copy of the given queue
template<class T> std::list<T> toList(std::queue<T> qCopy) {
    std::list<T> returnList;
    while (!qCopy.empty()) {
        returnList.push_back(qCopy.front());
        qCopy.pop();
    }
    return returnList;
}

纳入OP的用例:

#include <iostream>
int main() {
    std::queue<int> Q;

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

    std::cout << "\nqueue contains: ";
    for (auto i : toList(Q))
        std::cout << i << ", ";

    return 0;
}
相关问题