2015-03-24 6 views
6

Wie kann ich eine std::priority_queue mit einem Container vom Typ std::vector vorbelegen?Vorabzuweisen (reservieren) einer Prioritätswarteschlange <vector>?

std::priority_queue<unsigned char, std::vector<unsigned char>> pq; 
pq.c.reserve(1024); 

Kompiliert nicht, da der zugrunde liegende Vektor ein geschütztes Element ist. Ist es möglich, den Konstruktor des priority_queue zu verwenden, um ihn um einen vorreservierten Vektor zu wickeln?

Antwort

5

Ja, es gibt eine constructor dafür. Es ist etwas mühsam, dass Sie auch einen Komparator angeben:

std::vector<unsigned char> container; 
container.reserve(1024); 
std::priority_queue<unsigned char, std::vector<unsigned char>> pq (
    std::less<unsigned char>(), std::move(container)); 

Sie auch evil shenanigans verwenden können, um das geschützte Mitglied zugreifen, aber ich würde es nicht empfehlen.

3

könnte andere Lösung sein Ihre eigene Klasse von std :: priority_queue, wie abgeleitet zu machen:

class MyPQueue : public std::priority_queue<unsigned char, std::vector<unsigned char>> 
{ 
public: 
    MyPQueue(size_t reserve_size) 
    { 
     this->c.reserve(reserve_size); 
    } 
}; 

dann, im Code, ein MyPQueue Objekt auf diese Weise erstellen:

MyPQueue mpq(1024); 

welches Objekt kann zurück in die Basisklasse upcasted wo immer benötigt.

std::priority_queue<unsigned char, std::vector<unsigned char>>& pq = mpq; 
0

Im Allgemeinen in C++11 können Sie wie unten eine make_reserved Funktion schreiben.

#include <vector> 
#include <iostream> 
#include <utility> 
#include <functional> 

template <class T> 
std::vector<T> make_reserved(const std::size_t n) 
{ 
    std::vector<T> v; 
    v.reserve(n); 
    return std::move(v); 
} 

int main() 
{ 
    using Q = std::priority_queue<int, std::vector<int>>; 
    auto q = Q(std::less<int>(), make_reserved<int>(100)); 
    std::cout << q.size() << std::endl; 
}