如何从队列c ++中获取前5个元素

时间:2010-09-29 10:57:46

标签: c++

如何在不使用for循环的情况下从队列中获取前五个元素?

4 个答案:

答案 0 :(得分:5)

根本没有明确的循环:

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>

template <typename T>
class QueuePopper
{
public:
    QueuePopper(std::queue<T> &q) : q(q) {}
    T operator() (const T &) { T t = q.front(); q.pop(); return t; }
private:
    std::queue<T> &q;
};

int main()
{
    typedef std::string T;

    std::queue<T> q;

    ...

    std::vector<T> v(5);
    std::transform(v.begin(), v.end(), v.begin(), QueuePopper<T>(q));
}

答案 1 :(得分:4)

还有一种方法:

template<int n> void GetElements(queue<string>& qu)
{
    if(!qu.empty())
    {
        cout << qu.front() << '\n';
        qu.pop();
    }
    GetElements<n-1>(qu);
}

template<> void GetElements<0>(queue<string>& qu) {}

// and call:
GetElements<5>(qu);

或者:

switch(qu.size())
{
default: cout << qu.front() << '\n'; qu.pop();
case 4: cout << qu.front() << '\n'; qu.pop();
case 3: cout << qu.front() << '\n'; qu.pop();
case 2: cout << qu.front() << '\n'; qu.pop();
case 1: cout << qu.front() << '\n'; qu.pop();
case 0: ;
}

答案 2 :(得分:1)

你为什么要那样做?也许你必须同时掌握5个元素,这里的原因并不清楚。

无论如何 - 如果你的意思是STL <queue>

std::queue<Element> container;

Element e1, e2, e3, e3, e5;

e1 = container.front();
container.pop();
e2 = container.front();
container.pop();
e3 = container.front();
container.pop();
e4 = container.front();
container.pop();
e5 = container.front();
container.pop();

如果&lt;行为未定义queue上的5个元素。

如果您想避免使用Element副本,可以使用以下内容替换它,但是在这种情况下,请注意在弹出引用的元素后引用变为无效。

std::queue<Element> container;

Element& e1 = container.front();    // or const Element&
container.pop();
Element& e2 = container.front();
container.pop();
Element& e3 = container.front();
container.pop();
Element& e4 = container.front();
container.pop();
Element& e5 = container.front();
container.pop();

答案 3 :(得分:1)

#include <iostream>
#include <queue>

int main(){
    std::queue<std::string> q;
    for (int i = 0; i<5; ++i){
        std::string s;
        std::cin >> s;
        q.push(s);
    }
    int itemsToFetch = 5;
    do{
        std::string curString = q.front();
        q.pop();
        std::cout << curString << std::endl;
        --itemsToFetch;
    } while (itemsToFetch > 0 && !q.empty());
    return 0;
}