PDA

Tam Sürümünü Görmek İçin : Priority_Queue


hgedek
13/04/2008, 17:44
STL deki heap yapısını kullanmak istedim.Veri yapısı olarak ta priority_queue nin kodlarını kullanıyorum.Amacım delete işlemini doğrudan vector üzerinde gerçekleştirmek.Bu nedenle priority_queue deki container olarak kullandığım vector üzerinde erase işlemi yapmayı denedim.Sorun şu:Siz erase işlemini yapınca heap yapısı hata veriyor.Yani siliyosunuz ama devam edemiyorsunuz.Bir şekilde değiştirmeyi engellemişler diye düşündüm.Bunun mantığı konusunda fikri olan ?


acehreli
14/04/2008, 03:35
Ne yaptigini gormeden bir tahminde bulunmak zor. :( Kucuk bir ornek gosterebilir misin?

Ali

hgedek
14/04/2008, 09:54
Bu konuda şu bilgiyi buldum.Queue yapısının işleyişine dışarıdan müdahaleye izin yokmuş.Yani gidip _Container c; den bir elemanı silmem mümkün değilmiş.
Set denilen STL in bir başka Container ı ile heap yapısı kurmak istesem sıralı bir biçimde yerleştirdiğini gördüm.Ama merakım şu.Heap te parent child ilişkisi var.Yani binary bir tree.set te mantık nasıl.Benzer mi?Liner mi?

acehreli
15/04/2008, 08:17
set ve map de agac yapilaridir. Hemen hemen her yerde 'red-black tree'dir.

Ali

quasimodo
16/04/2008, 21:37
Ali abi priority_queue hakkinda biraz bilgi verebilirmisin ?

acehreli
17/04/2008, 01:42
Priority queue'nun Turkcesi "oncelikli kuyruk"tur. Kuyrukta baskalari olsa bile onceliklere gore hizmet edilir. (Bir tUr torpil yani... :) )

Cok cok kisaca:

push: nesne ekle
top: kuyrugun basindaki nesneye eris
pop: kuyrugun basindakini cikart

Bilmeyenler icin, heap, her dugumun kendi altindaki dugumlerden "oncelikli" oldugu bir agac yapisidir. Oyle olunca, en tepedeki (top) dugum dogal olarak en onceki olur. (Sirali agaclarda en onceki dugum en sol alttakidir; heap'in farki bu...)

Bir ornek:


#include <iostream>
#include <queue>

using namespace std;

int main()
{
priority_queue<int> kuyruk;

kuyruk.push(1);
kuyruk.push(6);
kuyruk.push(1);
kuyruk.push(0);
kuyruk.push(1);
kuyruk.push(5);

while (!kuyruk.empty()) {
cout << kuyruk.top() << ' ';
kuyruk.pop();
}

cout << '\n';
}


Ali