2010-09-29 48 views
1

如何在不使用for循環的情況下從隊列中獲取前五個元素?如何從隊列中獲取前5個元素C++

+1

什麼樣的隊列? – 2010-09-29 11:00:29

+0

隊列包含字符串值 – cje 2010-09-29 11:01:34

+7

使用while循環 2010-09-29 11:01:52

回答

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(); 

行爲是不確定的,如果在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(); 
+0

該代碼不起作用。聲明'e1'作爲參考意味着您需要立即初始化它。 – 2010-09-29 11:03:15

+0

@Konrad,thx,現在刪除 – 2010-09-29 11:04:43

+0

編輯並恢復 – 2010-09-29 11:25:51

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; 
} 
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)); 
} 
+0

在這個解決方案隱藏循環存在'變換',那麼你的循環隱藏的邊界在哪裏?我可以將循環導出到其他文件,這是一樣的。 – Svisstack 2010-09-29 11:51:16

+1

@Svisstack:當然。這是一個人爲的場景!但我沒有必要真的*寫*循環。 – 2010-09-29 12:00:14

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: ; 
} 
+0

+1,因爲每次看到它,我發現第二個構造非常聰明。 – ereOn 2010-09-29 12:04:26