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
- 1. Kolejki priorytetowe w Javie
- 2. Priorytetowe planowanie ponownego uruchamiania awarii usługi Android
- 3. Jak poznać priorytetowe szyny I18n
- 4. Jak wstawić elementy do kolejki w C#
- 5. Wstępnie przydzielić przestrzeń dla kolejki C++ STL
- 6. Kolejki priorytetów Java i porównywalny interfejs
- 7. Tworzenie kolejki w Scala
- 8. Kolejki pracy w Clojure
- 9. Jak prawidłowo ustawiać kolejki zadań do uruchomienia w języku C#
- 10. Dowolna implementacja kolejki wolnej od blokady pojedynczego klienta w C?
- 11. Łatwy sposób na przetwarzanie kolejki z N wątków w C#?
- 12. Odczekaj Collection (kolejki) blokowanie, aby zmniejszyć rozmiary w C#
- 13. Synchronizacja kolejki
- 14. Implementacja kolejki atomowej w QT5
- 15. Implementacja kolejki C za pomocą void * - dobra lub zła praktyka?
- 16. Przeniesienie wiadomości z kolejki martwej litery do kolejki wychodzącej MSMQ
- 17. Konserwacja kolejki MassTransit
- 18. Maksymalna długość kolejki scala
- 19. równoległe ForEach i kolejki
- 20. System kolejki komunikatów
- 21. Tworzenie kolejki przesyłania
- 22. Wada okrągłej kolejki?
- 23. RabbitMQ wstrzymać zużycie kolejki
- 24. Kolejki Mercurial: łączenie łatek
- 25. Perl Kolejki i Threading
- 26. Funkcjonalny typ kolejki
- 27. Limit kolejki WSMQ
- 28. AMQP dynamicznie subskrybując kolejki
- 29. Niepowtarzalny komunikat kolejki Azure
- 30. Na serwerze kolejki pamięci
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? –