Hier macht wohl kaum jemand etwas mit der Boost Library, aber C++ können
ja einige noch.
Ich hatte mich ja ende letzten Jahres bemüht das Fixup Interface für den
Boost Heap zu verstehen:
http://www.boost.org/doc/libs/1_54_0/doc/html/heap/concepts.html#heap.concepts.mutability
Da schreiben sie ja
1 | handle_t t3 = pq.push(3);
|
2 | handle_t t5 = pq.push(5);
|
3 | handle_t t1 = pq.push(1);
|
4 |
|
5 | *t3 = 4;
|
6 | pq.update(t3);
|
Bei mir war daraus geworden
http://www.ssalewski.de/tmp/rboost_fibonacci_queue.cpp
1 | void fq_update(VALUE q, VALUE hd, VALUE key)
|
2 | {
|
3 | XPQ *pq;
|
4 | heap_data* h;
|
5 | Data_Get_Struct(q, XPQ, pq);
|
6 | Data_Get_Struct(hd, heap_data, h);
|
7 | if (h->parent_queue == q)
|
8 | {
|
9 | (*h->handle).payload = h->payload = convert_key(key) * pq->key_sign;
|
10 | pq->update(h->handle);
|
11 | }
|
12 | else
|
13 | rb_raise(rb_eRuntimeError, "Fibonacci_Queue.update(): node is inserted in a different queue!");
|
14 | }
|
Schien ja anfangs auch gut zu funktionieren, aber seit ein paar Tagen
habe ich doch etwas Zweifel
Oder hätte man einfach schreiben sollen
ich weiss nicht mehr wie ich darauf gekommen war. Mit Google findet man
dazu auch kaum etwas. Ruby, BOOST, C++ ist schon eine etwas exostische
Mischung.
Ich kann ja auch nicht ganz ausschließen, dass die Boost Heap
Update-Funktionen tatsächlich fehlerhaft sind, viele Leute haben die
wohl nicht getestet. Von 2006 fand ich einen Fehlerbericht zum
Fibonacci-Heap, aber mit dem Binomial Heap bekomme ich auch in seltenen
Fällen unkonsistente Ergebnisse.
Jedenfalls ist diese fq_update-Funktion diejenige, der ich am wenigsten
traue, das übrige hatte ich, soweit ich mich erinnere, einigermaßen
verstanden.
Gestern habe ich durch Zufall mit Google gefunden, dass es auch eine
Erase-Funktionen zum Löschen vom beliebigen Elementen gibt, das wird in
der Boost Dokumentation sonst nie erwähnt. Na, wenigstens ein Nutzen von
den vielen verschwendeten Stunden.
Links:
Beitrag "C++ Verständnis (Boost-Library)"
Beitrag "Linux, Ruby C++ Extension,, Valgrind usw."