WPILibC++ 2027.0.0-alpha-4
Loading...
Searching...
No Matches
priority_queue.hpp
Go to the documentation of this file.
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#pragma once
6
7#include <algorithm>
8#include <concepts>
9#include <functional>
10#include <utility>
11#include <vector>
12
13namespace wpi::util {
14
15/**
16 * This class is the same as std::priority_queue with two changes:
17 *
18 * 1. Adds a remove() function for removing all elements from the priority queue
19 * that match the given value.
20 * 2. Replaces "void pop()" with "T pop()" so the element can be moved from the
21 * queue directly instead of copied from top().
22 */
23template <typename T, typename Sequence = std::vector<T>,
24 typename Compare = std::less<typename Sequence::value_type>>
25 requires std::same_as<T, typename Sequence::value_type>
27 public:
28 using value_type = typename Sequence::value_type;
29 using reference = typename Sequence::reference;
30 using const_reference = typename Sequence::const_reference;
31 using size_type = typename Sequence::size_type;
32 using container_type = Sequence;
33 using value_compare = Compare;
34
35 template <typename Seq = Sequence>
36 requires std::default_initializable<Compare> &&
37 std::default_initializable<Seq>
39
40 priority_queue(const Compare& comp, const Sequence& c) : c(c), comp(comp) {
41 std::make_heap(c.begin(), c.end(), comp);
42 }
43
44 explicit priority_queue(const Compare& comp, Sequence&& c = Sequence{})
45 : c(std::move(c)), comp(comp) {
46 std::make_heap(c.begin(), c.end(), comp);
47 }
48
49 template <typename InputIterator>
50 priority_queue(InputIterator first, InputIterator last, const Compare& comp,
51 const Sequence& c)
52 : c(c), comp(comp) {
53 c.insert(c.end(), first, last);
54 std::make_heap(c.begin(), c.end(), comp);
55 }
56
57 template <typename InputIterator>
58 priority_queue(InputIterator first, InputIterator last,
59 const Compare& comp = Compare{}, Sequence&& c = Sequence{})
60 : c(std::move(c)), comp(comp) {
61 c.insert(c.end(), first, last);
62 std::make_heap(c.begin(), c.end(), comp);
63 }
64
65 [[nodiscard]]
66 bool empty() const {
67 return c.empty();
68 }
69
70 size_type size() const { return c.size(); }
71
72 const_reference top() const { return c.front(); }
73
74 void push(const value_type& value) {
75 c.push_back(value);
76 std::push_heap(c.begin(), c.end(), comp);
77 }
78
79 void push(value_type&& value) {
80 c.push_back(std::move(value));
81 std::push_heap(c.begin(), c.end(), comp);
82 }
83
84 template <typename... Args>
85 void emplace(Args&&... args) {
86 c.emplace_back(std::forward<Args>(args)...);
87 std::push_heap(c.begin(), c.end(), comp);
88 }
89
90 T pop() {
91 std::pop_heap(c.begin(), c.end(), comp);
92 auto ret = std::move(c.back());
93 c.pop_back();
94 return ret;
95 }
96
97 bool remove(const T& value) {
98 auto it = std::find(c.begin(), c.end(), value);
99 if (it != this->c.end()) {
100 c.erase(it);
101 std::make_heap(c.begin(), c.end(), comp);
102 return true;
103 } else {
104 return false;
105 }
106 }
107
108 protected:
109 Sequence c;
110 Compare comp;
111};
112
113} // namespace wpi::util
Sequence c
Definition priority_queue.hpp:109
Sequence container_type
Definition priority_queue.hpp:32
Compare comp
Definition priority_queue.hpp:110
void emplace(Args &&... args)
Definition priority_queue.hpp:85
bool remove(const T &value)
Definition priority_queue.hpp:97
priority_queue()
Definition priority_queue.hpp:38
void push(value_type &&value)
Definition priority_queue.hpp:79
const_reference top() const
Definition priority_queue.hpp:72
priority_queue(const Compare &comp, const Sequence &c)
Definition priority_queue.hpp:40
typename Sequence::reference reference
Definition priority_queue.hpp:29
typename Sequence::size_type size_type
Definition priority_queue.hpp:31
void push(const value_type &value)
Definition priority_queue.hpp:74
typename Sequence::value_type value_type
Definition priority_queue.hpp:28
bool empty() const
Definition priority_queue.hpp:66
Compare value_compare
Definition priority_queue.hpp:33
priority_queue(InputIterator first, InputIterator last, const Compare &comp, const Sequence &c)
Definition priority_queue.hpp:50
T pop()
Definition priority_queue.hpp:90
priority_queue(const Compare &comp, Sequence &&c=Sequence{})
Definition priority_queue.hpp:44
typename Sequence::const_reference const_reference
Definition priority_queue.hpp:30
size_type size() const
Definition priority_queue.hpp:70
priority_queue(InputIterator first, InputIterator last, const Compare &comp=Compare{}, Sequence &&c=Sequence{})
Definition priority_queue.hpp:58
Definition StringMap.hpp:773
Definition raw_os_ostream.hpp:19