How to preallocate(reserve) a priority_queue?

前端 未结 4 907
-上瘾入骨i
-上瘾入骨i 2021-01-01 20:35

How can I preallocate a std::priority_queue with a container of type std::vector?

std::priority_queue

        
相关标签:
4条回答
  • 2021-01-01 20:44

    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.

    0 讨论(0)
  • 2021-01-01 20:48

    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;
    
    0 讨论(0)
  • 2021-01-01 20:54

    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.

    0 讨论(0)
  • 2021-01-01 21:01

    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;
    }
    
    0 讨论(0)
提交回复
热议问题