Czy istnieje sposób na powtórzenie kolejki priorytetów w języku C++? Rozumiem, że są one mniej lub więcej niezmienne i jedyną manipulacją kontenera jest najwyższy element. Chciałbym móc wydrukować zawartość kolejki priorytetowej, ale nie jestem pewien, jak w ogóle podejść do problemu.Kolejki priorytetowe w C++
Odpowiedz
Podstawowy pojemnik to element danych protected
o nazwie c
(więcej szczegółów można znaleźć w artykule here). Dlatego zawsze możesz dziedziczyć z std::priority_queue
i eksportować kilka iteratorów nad tym kontenerem (jeśli jest dostępny).
Jako minimalną, np roboczej:
#include<queue>
#include<iostream>
struct MyPriorityQueue: std::priority_queue<int> {
auto begin() const { return c.begin(); }
auto end() const { return c.end(); }
};
int main() {
MyPriorityQueue pq;
pq.push(0);
pq.push(1);
for(auto &v: pq) {
std::cout << v << std::endl;
}
}
Uwaga: dziedziczenie z struktur danych w przestrzeni nazw std::
jest zwykle zalecane.
To znaczy, że działa przynajmniej.
Powyższy kod działa w C++ 14.
Poniżej nieco zmodyfikowanej wersji, która działa również w C++ 11 na żądanie w komentarzach:
#include<queue>
#include<iostream>
struct MyPriorityQueue: std::priority_queue<int> {
decltype(c.begin()) begin() const { return c.begin(); }
decltype(c.end()) end() const { return c.end(); }
};
int main() {
MyPriorityQueue pq;
pq.push(0);
pq.push(1);
for(auto &v: pq) {
std::cout << v << std::endl;
}
}
podstawie odpowiedzi @ skypjack, oto jest na matrycy wersja:
#include<queue>
#include<iostream>
template<class T, class C = vector<T>, class P = less<typename C::value_type> >
struct MyPriorityQueue :
std::priority_queue<T,C,P> {
typename C::iterator begin() { return std::priority_queue<T, C, P>::c.begin(); }
typename C::iterator end() { return std::priority_queue<T, C, P>::c.end(); }
};
int main() {
MyPriorityQueue<int> pq;
pq.push(0);
pq.push(1);
for (auto &v : pq) {
std::cout << v << std::endl;
}
}
Nie można go używać z' typedef', Na przykład 'typedef MyPriorityQueue
Wynika to z faktu, że konstruktory nie zostały odziedziczone. 'using priority_queue
Szybki i brudny sposób jest, jak przypuszczam, kopiować i usuwać. – theoden
Nie jestem pewien, czy coś nowego w C++ zmieniło [poradę w tym pytaniu] (http://stackoverflow.com/questions/4484767/how-to-iterate-over-a-priority-queue). – tadman
Pytasz o std :: priority_queue? –