/*============================================================================= Copyright (c) 2010 Tim Blechmann Use, modification and distribution is subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #include #include #include "../../../boost/heap/fibonacci_heap.hpp" using std::cout; using std::endl; using namespace boost::heap; //[ basic_interface // PriorityQueue is expected to be a max-heap of integer values template void basic_interface(void) { PriorityQueue pq; pq.push(2); pq.push(3); pq.push(1); cout << "Priority Queue: popped elements" << endl; cout << pq.top() << " "; // 3 pq.pop(); cout << pq.top() << " "; // 2 pq.pop(); cout << pq.top() << " "; // 1 pq.pop(); cout << endl; } //] //[ iterator_interface // PriorityQueue is expected to be a max-heap of integer values template void iterator_interface(void) { PriorityQueue pq; pq.push(2); pq.push(3); pq.push(1); typename PriorityQueue::iterator begin = pq.begin(); typename PriorityQueue::iterator end = pq.end(); cout << "Priority Queue: iteration" << endl; for (typename PriorityQueue::iterator it = begin; it != end; ++it) cout << *it << " "; // 1, 2, 3 in unspecified order cout << endl; } //] //[ ordered_iterator_interface // PriorityQueue is expected to be a max-heap of integer values template void ordered_iterator_interface(void) { PriorityQueue pq; pq.push(2); pq.push(3); pq.push(1); typename PriorityQueue::ordered_iterator begin = pq.ordered_begin(); typename PriorityQueue::ordered_iterator end = pq.ordered_end(); cout << "Priority Queue: ordered iteration" << endl; for (typename PriorityQueue::ordered_iterator it = begin; it != end; ++it) cout << *it << " "; // 3, 2, 1 (i.e. 1, 2, 3 in heap order) cout << endl; } //] //[ merge_interface // PriorityQueue is expected to be a max-heap of integer values template void merge_interface(void) { PriorityQueue pq; pq.push(3); pq.push(5); pq.push(1); PriorityQueue pq2; pq2.push(2); pq2.push(4); pq2.push(0); pq.merge(pq2); cout << "Priority Queue: merge" << endl; cout << "first queue: "; while (!pq.empty()) { cout << pq.top() << " "; // 5 4 3 2 1 0 pq.pop(); } cout << endl; cout << "second queue: "; while (!pq2.empty()) { cout << pq2.top() << " "; // 4 2 0 pq2.pop(); } cout << endl; } //] //[ heap_merge_algorithm // PriorityQueue is expected to be a max-heap of integer values template void heap_merge_algorithm(void) { PriorityQueue pq; pq.push(3); pq.push(5); pq.push(1); PriorityQueue pq2; pq2.push(2); pq2.push(4); pq2.push(0); boost::heap::heap_merge(pq, pq2); cout << "Priority Queue: merge" << endl; cout << "first queue: "; while (!pq.empty()) { cout << pq.top() << " "; // 5 4 3 2 1 0 pq.pop(); } cout << endl; cout << "second queue: "; while (!pq2.empty()) { cout << pq2.top() << " "; // 4 2 0 pq2.pop(); } cout << endl; } //] //[ mutable_interface // PriorityQueue is expected to be a max-heap of integer values template void mutable_interface(void) { PriorityQueue pq; typedef typename PriorityQueue::handle_type handle_t; handle_t t3 = pq.push(3); handle_t t5 = pq.push(5); handle_t t1 = pq.push(1); pq.update(t3, 4); pq.increase(t5, 7); pq.decrease(t1, 0); cout << "Priority Queue: update" << endl; while (!pq.empty()) { cout << pq.top() << " "; // 7, 4, 0 pq.pop(); } cout << endl; } //] //[ mutable_fixup_interface // PriorityQueue is expected to be a max-heap of integer values template void mutable_fixup_interface(void) { PriorityQueue pq; typedef typename PriorityQueue::handle_type handle_t; handle_t t3 = pq.push(3); handle_t t5 = pq.push(5); handle_t t1 = pq.push(1); *t3 = 4; pq.update(t3); *t5 = 7; pq.increase(t5); *t1 = 0; pq.decrease(t1); cout << "Priority Queue: update with fixup" << endl; while (!pq.empty()) { cout << pq.top() << " "; // 7, 4, 0 pq.pop(); } cout << endl; } //] //[ mutable_interface_handle_in_value struct heap_data { fibonacci_heap::handle_type handle; int payload; heap_data(int i): payload(i) {} bool operator<(heap_data const & rhs) const { return payload < rhs.payload; } }; void mutable_interface_handle_in_value(void) { fibonacci_heap heap; heap_data f(2); fibonacci_heap::handle_type handle = heap.push(f); (*handle).handle = handle; // store handle in node } //] int main(void) { using boost::heap::fibonacci_heap; cout << std::setw(2); basic_interface >(); cout << endl; iterator_interface >(); cout << endl; ordered_iterator_interface >(); cout << endl; merge_interface >(); cout << endl; mutable_interface >(); cout << endl; mutable_fixup_interface >(); mutable_interface_handle_in_value(); }