如何在不使用for
循环的情况下从队列中获取前五个元素?
答案 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;
}