2010-10-06 157 views
21

我有這樣的要求。對於一個功能,我得到輸入作爲一個數字流。我的意思是,函數在每次調用中都會繼續使用單個號碼進行調用。我正在使用隊列來存儲數字流。只有滿足某些條件時,我才需要處理收集的一組數字。如果條件不滿足,我需要拋出隊列中的所有元素,然後開始存儲新的數字。爲了清空隊列,我找不到clear()方法。所以我像下面一樣循環。爲什麼std :: queue不支持clear()函數?

while(!q.empty()) 
    q.pop(); 

我得到了有效的算法在

How do I clear the std::queue efficiently?

我的問題清理隊列是:爲什麼隊列不支持clear()函數?

當deque和vector支持clear()方法時,支持queue的技術難度如何?

或者是我的上面的用例非常罕見,因此不支持? 謝謝。

回答

19

根據http://www.cplusplus.com/reference/stl/queue/

隊列被實現爲容器的適配器,其是使用特定容器類的封裝對象作爲其底層的容器類,提供了一個特定的一組成員函數來訪問它的元件。

這意味着隊列使用一個已經存在的容器,並且實際上就是這個容器的一個接口作爲一個FIFO隊列。

這意味着隊列並不意味着被清除。如果需要清除隊列,這意味着實際上需要使用不是隊列的對象,因此應該使用實際的基礎容器類型,默認情況下爲deque。

+0

+1,雖然有效的清算*是可能的,請參閱我的答案。 – sellibitze 2010-10-06 16:26:43

+3

所以我認爲'std :: queue'是一個受限制的使用的受損隊列,是消息嗎? – bobobobo 2013-05-24 00:37:04

+0

隊列適配器背後的基本原理是插入的項目必須在某個時刻被提取,並且不會因使用多元素刪除操作而丟失。那有意義嗎 ?不一定,因爲它可以清除反正... – SirDarius 2016-03-27 19:15:44

3

queue只是一些底層容器的適配器,默認情況下爲deque,具有受限制的功能(如您在此處所述)。如果您想要全功能,請使用底層deque而不是queue

25

除了什麼已經說過,你可以清除隊列很容易:

queue<int> q; 
... 
q = queue<int>(); // Assign an empty queue 

或C++ 11

q = {}; 
+0

C++ 11版本:'q = {};' – Drax 2014-03-20 10:35:25

+5

雖然,用gcc 4.9.1'q = {}'給出錯誤'轉換爲std :: queue來自初始化列表的<...>將使用顯式構造函數。 – 2014-11-23 18:43:03

2

添加到了我成長的名單使STL可讀'功能:

template <typename T> 
void Clear(std::queue<T>& Queue) 
{ 
    Queue = std::queue<T>(); // Assign to empty queue 
} 

這只是一個包裝圍繞sellibitze的出色答案,但意味着我不必在每次使用該技術時都添加評論。

相關問題