How can I preallocate a std::priority_queue
with a container of type std::vector
?
std::priority_queue
I don't have enough reputation to comment on Mike Seymour's post, but he ommited the third template argument of std::priority_queue
:
std::vector<unsigned char> container;
container.reserve(1024);
std::priority_queue<unsigned char, std::vector<unsigned char>, std::less<unsigned char>> pq(std::less<unsigned char>(), std::move(container));
It is quite verbose for sure, but it does the work.
Another solution might be to make your own class derived from std::priority_queue, such as:
class MyPQueue : public std::priority_queue<unsigned char, std::vector<unsigned char>>
{
public:
MyPQueue(size_t reserve_size)
{
this->c.reserve(reserve_size);
}
};
then, in the code, create a MyPQueue object in this way:
MyPQueue mpq(1024);
which object can be upcasted back to the base class whenether needed.
std::priority_queue<unsigned char, std::vector<unsigned char>>& pq = mpq;
Yes, there's a constructor for that. It's slightly tedious that you also have to specify a comparator:
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));
You can also use evil shenanigans to access the protected member, but I wouldn't recommend it.
In general with C++11
you can write a make_reserved
function as below.
#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 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;
}