如何使用std::vector类型的容器预分配std::priority_queue?
std::vector
std::priority_queue
std::priority_queue<unsigned char, std::vector<unsigned char>> pq; pq.c.reserve(1024);
不编译,因为基础向量是受保护的成员。是否可以使用priority_queue的构造函数将其 Package 在预先保留的向量周围?
priority_queue
gcuhipw91#
是的,有一个constructor。还必须指定一个比较器,这有点繁琐:
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));
你也可以使用邪恶的诡计来访问受保护的成员,但我不建议这样做。
cigdeys32#
另一种解决方案可能是创建自己的类,从std::priority_queue派生,例如:
class MyPQueue : public std::priority_queue<unsigned char, std::vector<unsigned char>> { public: MyPQueue(size_t reserve_size) { this->c.reserve(reserve_size); } };
然后,在代码中,以这种方式创建MyPCeue对象:
MyPQueue mpq(1024);
该对象可以在需要时被向上转换回基类。
std::priority_queue<unsigned char, std::vector<unsigned char>>& pq = mpq;
p8h8hvxi3#
使用C++14,我们可以写
C++14
#include <vector> #include <queue> #include <iostream> #include <utility> #include <functional> template <class T> auto make_reserved(const std::size_t n) { std::vector<T> v; v.reserve(n); return v; } template <class T> auto make_queue(const std::size_t n) { return std::priority_queue<T>(std::less<T>(), make_reserved<T>(n)); } int main() { auto q = make_queue<int>(100); q.push(1); q.push(2); std::cout << q.size() << std::endl; }
kxxlusnw4#
我没有足够的声誉来评论Mike Seymour的帖子,但他省略了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));
这是相当冗长的肯定,但它做的工作。
4条答案
按热度按时间gcuhipw91#
是的,有一个constructor。还必须指定一个比较器,这有点繁琐:
你也可以使用邪恶的诡计来访问受保护的成员,但我不建议这样做。
cigdeys32#
另一种解决方案可能是创建自己的类,从std::priority_queue派生,例如:
然后,在代码中,以这种方式创建MyPCeue对象:
该对象可以在需要时被向上转换回基类。
p8h8hvxi3#
使用
C++14
,我们可以写kxxlusnw4#
我没有足够的声誉来评论Mike Seymour的帖子,但他省略了
std::priority_queue
的第三个模板参数:这是相当冗长的肯定,但它做的工作。