2015-03-24 38 views
6

Come è possibile preassegnare un std::priority_queue con un contenitore di tipo std::vector?Come preallocare (prenotare) un priority_queue <vector>?

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

Non compila perché il vettore sottostante è un membro protetto. È possibile utilizzare il costruttore di priority_queue per avvolgerlo attorno a un vettore pre-riservato?

risposta

5

Sì, c'è uno constructor per quello. E 'un po' noioso che si deve anche specificare un comparatore:

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)); 

È inoltre possibile utilizzare evil shenanigans per accedere al membro protetto, ma io non lo consiglio.

3

Un'altra soluzione potrebbe essere quella di rendere la propria classe derivata da std :: priority_queue, come ad esempio:

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

poi, nel codice, creare un oggetto MyPQueue in questo modo:

MyPQueue mpq(1024); 

quale oggetto può essere ricondotto alla classe base quando necessario.

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

In generale in C++11 si può scrivere una funzione make_reserved come di seguito.

#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; 
}