2010-10-06 7 views
21

Bunun gibi bir ihtiyacım var. Bir fonksiyon için, bir sayı akışı olarak girdim. Demek istediğim, işlev her çağrıda tek bir numara ile aranmaya devam ediyor. Sayıların akışını depolamak için kuyruk kullanıyorum. Toplanan bir sayı kümesini yalnızca bazı koşulların karşılanması durumunda işleme koymam gerekiyor. Durumun yerine getirilmemesi durumunda, sıradaki tüm elemanları atmam ve daha sonra yeni numaralar depolamaya başladım. Kuyruğu boşaltmak için clear() yöntemini bulamadım. Yani aşağıda olduğu gibi döngü yapıyorum. kuyruğu açık() fonksiyonunu desteklemiyor Neden:std :: queue neden clear() işlevini desteklemiyor?

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

I

How do I clear the std::queue efficiently?

Benim soruya kuyruğu temizlemek için verimli bir algoritma var mı?

Deque ve vektör clear() yöntemini destekliyorsa, sıra için onu desteklemenin teknik zorluğu nedir?

Veya yukarıdaki yukarıdaki mycase çok nadir ve bu nedenle desteklenmiyor mu? Teşekkür ederiz.

cevap

19

,

sıralar o elemanları erişmek için üye fonksiyonları, belirli bir temin altta yatan kap olarak, belirli bir kap sınıfın bir kapsüllenmiş nesne kullanmak sınıfları olan konteynerler bağdaştırıcıları, uygulanan . Gerçekten kuyruk mevcut bir kabı kullandığı anlamına gelir, ve adildir

bir FIFO kuyruğuna olarak bu kapsayıcı bir arayüz.

Bu, kuyrukların temizlenmesinin amaçlanmadığı anlamına gelir. Bir sırayı temizlemeniz gerekiyorsa, bu aslında sıra olmayan bir nesneyi kullanmanız gerektiği anlamına gelir ve bu nedenle, varsayılan olarak bir deque olan gerçek temel kapsayıcı türünü kullanmanız gerekir. 'Benim büyüyen listesine bu

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

veya C++ 11

q = {}; 
+0

+1, Gerçi, verimli takas * * mümkündür, cevabımı gör. – sellibitze

+3

Sanırım std :: queue çok sınırlı kullanımlara yönelik bozulmuş bir kuyruk, mesaj mı? – bobobobo

+0

Sıra bağdaştırıcısının ardındaki mantık, eklenen öğelerin bir noktada ayıklanması ve çok öğeli silme işlemi kullanılarak kaybolmamasıdır. Bu mantıklı mı ?Her neyse, her neyse temizlenebilir ... – SirDarius

3

queue yalnızca bazı temel kaplar için bir bağdaştırıcıdır, varsayılan olarak deque, kısıtlı işlevi olan (burada belirtildiği gibi). Tam üfleme işlevini istiyorsanız, queue yerine deque temelini kullanın. http://www.cplusplus.com/reference/stl/queue/ göre

25

, sen çok kolay bir kuyruk temizleyebilirsiniz STL okunabilir hale getir 'işlevleri:

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

Sadece bir sarıcı sellibitze'nin mükemmel cevabı etrafında, ancak tekniği her kullandığımda da bir yorum eklemem gerekmediği anlamına geliyor.

+0

C++ 11 sürümü: 'q = {};' – Drax

+5

gcc 4.9.1 ile birlikte q = {} 'hata verir st std :: sıraya dönüştürme Başlatıcı listesinden <...>, açık yapıcı kullanacaktır. –

2

Added'de: Hali hazırda söylenenlerin gelen