Boost.Heap イテレータを使って要素を更新

#6825 compile error : fibonacci_heap::s_handle_from_iterator


先日バグ報告したのを修正してもらったので、早速使ってみましょう。
Boost.Heapの優先順位付きキューは、要素を追加する際に返されるハンドルを用いて要素を更新することができますが、イテレータからハンドルに変換するPriorityQueue::s_handle_from_iterator()静的関数を持っているので、イテレータを介して要素を更新することができます。

#include <iostream>
#include <algorithm>
#include <boost/heap/fibonacci_heap.hpp>

int main ()
{
    boost::heap::fibonacci_heap<int> que;

    que.push(3);
    que.push(1);
    que.push(4);

    que.update(
        decltype(que)::s_handle_from_iterator(que.begin()),
        6);

    std::for_each(que.ordered_begin(), que.ordered_end(), [](int x) {
        std::cout << x << std::endl;
    });
}
6
3
1

注意すべき点は、s_handle_from_iterator()が受け取るのはordered_iteratorではなくiteratorであるという点です。現時点では、挿入順のイテレータからのみハンドルに変換することができます。


この機能は、Boost 1.49.0時点ではfibonacci_heapで動かないので、それ以降のtrunkバージョンもしくはそれ以降のリリースバージョンで導入されると思われます。


関連エントリ:
Boost.Heap 値の更新