2017-01-27 20 views
5

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++

+2

Szybki i brudny sposób jest, jak przypuszczam, kopiować i usuwać. – theoden

+0

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

+0

Pytasz o std :: priority_queue? –

Odpowiedz

6

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; 
    } 
} 
+0

auto begin() daje błąd C3551: oczekiwany jest końcowy typ powrotu. Przynajmniej podczas kompilacji z VS2013. – Laszlo

+0

@Laszlo Jest to C++ 14. Wpisz odpowiedni typ lub 'decltype', aby działał w C++ 11. I tak aktualizuję odpowiedź. – skypjack

+0

Tak, prawda. Dzięki :) – Laszlo

2

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; 
    } 
} 
+0

Nie można go używać z' typedef', Na przykład 'typedef MyPriorityQueue CMP> customq_type;' 'customq_type customq (parametr)' Pobiera następujące: 'błędu: brak zgodnego konstruktora dla inicjalizacji customq_type'. Proszę o pomoc. – TJain

+0

Wynika to z faktu, że konstruktory nie zostały odziedziczone. 'using priority_queue :: priority_queue', powinniśmy być w stanie dziedziczyć konstruktory. – TJain