C ++ priority_queue底层向量容器容量调整大小

时间:2010-09-08 09:40:43

标签: c++ priority-queue

我正在使用priority_queue,并将vector作为基础容器。但是我希望堆的大小非常大。我知道动态矢量容量调整大小的问题。所以我正在寻找最初为priority_queue中的底层向量分配足够空间的方法。是否有任何建议可以实现这一目标?

由于

5 个答案:

答案 0 :(得分:24)

stdlib容器适配器提供了一个“后门”来访问底层容器:容器是一个名为c的受保护成员。

因此,您可以从适配器继承以获取对容器的访问权限:

#include <queue>
#include <iostream>

template <class T>
class reservable_priority_queue: public std::priority_queue<T>
{
public:
    typedef typename std::priority_queue<T>::size_type size_type;
    reservable_priority_queue(size_type capacity = 0) { reserve(capacity); };
    void reserve(size_type capacity) { this->c.reserve(capacity); } 
    size_type capacity() const { return this->c.capacity(); } 
};

int main()
{
    reservable_priority_queue<int> q;
    q.reserve(10000);
    std::cout << q.capacity() << '\n';
}

如果您对从stdlib类继承感到不满意,请使用私有继承,并使用priority_queue声明使using的所有方法都可访问。

答案 1 :(得分:3)

您无法直接访问基础容器来修改容量。但是,您可以将内部使用的容器更改为std::dequestd::deque容器可能比矢量略慢(不是大O表示法),但增长速度要快得多,因为它不需要重新定位所有现有元素。

答案 2 :(得分:0)

使用reserve功能:

std::vector<Type>::reserve(size_t size)

样品:

std::vector<int> vec;
vec.reserve(10000);
std::priority_queue<int> q (std::less<int>(), vec);

答案 3 :(得分:0)

David对Alexey的回答是正确的:向量实现将分配副本上保留的内容的可能性不大。因此要么提供自己的容器来执行此操作,要么从priority_queue继承并提供一些成员来使用底层容器。

答案 4 :(得分:0)

正如David所说,使用std :: deque可能是一个很好的解决方案。内存块足够小,通常允许您在队列增长时保留大部分内存。 然而,这只是一个更安全的解决方案,但不是一个安全的解决方案。

如果您不太关心效率,可以使用stlxxl,它是超大型数据集标准模板库的实现。这样,可分配内存将成为您的整个硬盘(该库还支持多个硬盘或网络驱动器)。