2016-04-27 4 views
1

zu initialisieren in construction of a priority queue gesagt wird, Option (12):Was ist der schnellste Weg, um eine priority_queue von einer unordered_set

template< class InputIt > 
priority_queue(InputIt first, InputIt last, 
       const Compare& compare = Compare(), 
       Container&& cont = Container()); 

Aber ich weiß nicht, wie das ot zu verwenden. Ich habe eine nicht leere std::unordered_set<std::shared_ptr<MyStruct>> mySet, und ich möchte es in eine Prioritätswarteschlange konvertieren. Außerdem erstelle ich einen Komparator struct MyComparator:

struct MyComparator { 
    bool operator()(const std::shared_ptr<myStruct>& a, 
        const std::shared_ptr<myStruct>& b){...} 
}; 

Nun, wie ich ein neues priority_queue myQueue in einer besseren Art und Weise bauen kann? Früher habe ich die folgende und es funktioniert:

std::priority_queue<std::shared_ptr<MyStruct>, std::deque<std::shared_ptr<MyStruct>, MyComparator> 
    myQueue(mySet.begin(), mySet.end()); 

gebenchmarkt ich sowohl Vektor- als auch deque, und ich finde, deque wird Vektor übertreffen, wenn die Größe relativ groß ist (~ 30K). Da wir bereits die Größe mySet kennen, sollte ich die Deque mit dieser Größe erstellen. Aber wie kann ich diese priority_queue mit meinem eigenen Komparator und vordefinierten Deque erstellen, sagen wir myDeque?

+0

Werden Sie später weitere Elemente in die Prioritätswarteschlange einfügen? –

+0

Ja, der Algorithmus wird den schwersten knallen, seinen Status überprüfen und weitere Objekte hinzufügen, die mit dem schwersten zusammenhängen. Diese Art der Insertion könnte wahrscheinlich viele Male vorkommen (etwa die Hälfte der ursprünglichen Größe). –

Antwort

1

Da Sie bereits festgestellt haben, dass std::deque gibt Ihnen eine bessere Leistung als std::vector, ich glaube nicht, es gibt viel mehr Sie in Bezug auf tun können, wie Sie die priority_queue konstruieren. Wie Sie wahrscheinlich gesehen haben, gibt es keine std::deque::reserve() Methode, so dass es einfach nicht möglich ist, ein Deque mit Speicher zu erstellen, der im Voraus zugewiesen wurde. Für die meisten Anwendungsfälle ist dies kein Problem, da das Hauptmerkmal von Deque gegenüber Vektor ist, dass Deque keine Elemente kopieren muss, wenn neue eingefügt werden.

Wenn Sie immer noch nicht die Leistung erreichen, die Sie wünschen, können Sie entweder rohe Zeiger speichern (Ihre Smartpointer draußen halten), oder einfach Ihre unordered_map in eine reguläre map ändern und sich auf die Bestellung verlassen, die der Container bietet.

Verwandte Themen