28 : container(numberOfIntegers), compare(compare), positions(numberOfIntegers) {
29 std::iota(container.begin(), container.end(), 0);
30 std::make_heap(container.begin(), container.end(), compare);
35 uint64_t position = positions[element];
36 if (position >= container.size()) {
40 uint64_t parentPosition = (position - 1) / 2;
41 while (position > 0 && compare(container[parentPosition], container[position])) {
42 std::swap(positions[container[parentPosition]], positions[container[position]]);
43 std::swap(container[parentPosition], container[position]);
45 position = parentPosition;
46 parentPosition = (position - 1) / 2;
49 STORM_LOG_ASSERT(std::is_heap(container.begin(), container.end(), compare),
"Heap structure lost.");
74 if (container.size() > 1) {
76 std::swap(positions[container.front()], positions[container.back()]);
77 std::swap(container.front(), container.back());
81 uint64_t positionToSift = 0;
82 uint64_t child = 2 * positionToSift + 1;
84 while (child < container.size()) {
85 if (child + 1 < container.size()) {
87 child = compare(container[child], container[child + 1]) ? child + 1 : child;
90 if (compare(container[positionToSift], container[child])) {
91 std::swap(positions[container[positionToSift]], positions[container[child]]);
92 std::swap(container[positionToSift], container[child]);
94 positionToSift = child;
95 child = 2 * positionToSift + 1;
99 }
else if (compare(container[positionToSift], container[child])) {
100 std::swap(positions[container[positionToSift]], positions[container[child]]);
101 std::swap(container[positionToSift], container[child]);
103 positionToSift = child;
104 child = 2 * positionToSift + 1;
111 container.pop_back();
114 STORM_LOG_ASSERT(std::is_heap(container.begin(), container.end(), compare),
"Heap structure lost.");