29 : container(numberOfIntegers), compare(compare), positions(numberOfIntegers) {
30 std::iota(container.begin(), container.end(), 0);
31 std::make_heap(container.begin(), container.end(), compare);
36 uint64_t position = positions[element];
37 if (position >= container.size()) {
41 uint64_t parentPosition = (position - 1) / 2;
42 while (position > 0 && compare(container[parentPosition], container[position])) {
43 std::swap(positions[container[parentPosition]], positions[container[position]]);
44 std::swap(container[parentPosition], container[position]);
46 position = parentPosition;
47 parentPosition = (position - 1) / 2;
50 STORM_LOG_ASSERT(std::is_heap(container.begin(), container.end(), compare),
"Heap structure lost.");
75 if (container.size() > 1) {
77 std::swap(positions[container.front()], positions[container.back()]);
78 std::swap(container.front(), container.back());
82 uint64_t positionToSift = 0;
83 uint64_t child = 2 * positionToSift + 1;
85 while (child < container.size()) {
86 if (child + 1 < container.size()) {
88 child = compare(container[child], container[child + 1]) ? child + 1 : child;
91 if (compare(container[positionToSift], container[child])) {
92 std::swap(positions[container[positionToSift]], positions[container[child]]);
93 std::swap(container[positionToSift], container[child]);
95 positionToSift = child;
96 child = 2 * positionToSift + 1;
100 }
else if (compare(container[positionToSift], container[child])) {
101 std::swap(positions[container[positionToSift]], positions[container[child]]);
102 std::swap(container[positionToSift], container[child]);
104 positionToSift = child;
105 child = 2 * positionToSift + 1;
112 container.pop_back();
115 STORM_LOG_ASSERT(std::is_heap(container.begin(), container.end(), compare),
"Heap structure lost.");