C++ C++;优先级队列基础向量容器容量调整

C++ C++;优先级队列基础向量容器容量调整,c++,priority-queue,C++,Priority Queue,我使用带有向量的优先级队列作为底层容器。但是,我希望堆的大小非常大。我知道动态向量容量调整存在问题。因此,我正在寻找一种方法,以便在优先级队列中为底层向量分配足够的空间。有什么建议可以实现这一目标吗 谢谢使用保留功能: std::vector<Type>::reserve(size_t size) std::vector::reserve(大小) 样本: std::vector<int> vec; vec.reserve(10000); std::priority_q

我使用带有向量的优先级队列作为底层容器。但是,我希望堆的大小非常大。我知道动态向量容量调整存在问题。因此,我正在寻找一种方法,以便在优先级队列中为底层向量分配足够的空间。有什么建议可以实现这一目标吗


谢谢

使用
保留
功能:

std::vector<Type>::reserve(size_t size)
std::vector::reserve(大小)
样本:

std::vector<int> vec;
vec.reserve(10000);
std::priority_queue<int> q (std::less<int>(), vec);
std::向量向量向量机;
车辆储备(10000);
std::priority_队列q(std::less(),vec);

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';
}
#包括
#包括
模板
类可保留的\u优先级\u队列:public std::priority\u队列
{
公众:
typedef typename std::优先级\队列::大小\类型大小\类型;
可保留的_优先级_队列(大小_类型容量=0){保留(容量);};
无效保留(大小\类型容量){this->c.reserve(容量);}
size_type capacity()const{返回此->c.capacity();}
};
int main()
{
可预约优先级队列q;
q、 储备(10000);

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

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

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


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

我不认为这是一个解决方案。标准只要求内部容器用该特定构造函数的第二个参数初始化。这意味着
std::vector
copy构造函数将被称为作为参数传递
vec
,然后它就归结为
std::vector::vector(std::vector const&)
是保持相同容量所必需的。该标准没有提供这种保证。编辑:我刚刚用g++4.0进行了测试,复制构造函数没有
reserve()
以保持复制向量中的容量。+1从理论上讲,我通常反对从标准容器继承,但在这种情况下,我内心的工程告诉我这可能是最好的解决方案。我不喜欢这个解决方案有两个原因:1/从具有公共非虚拟析构函数的类继承会让人感觉很糟糕,非常糟糕,2/这个后门在cplusplus.com和…上都没有提到。我有一种不好的感觉,这是特定于实现的,根本不是标准。@Matthiew M。后门在标准中,所以在技术上是正确的。我同意从容器继承通常不是最好的建议…#定义受保护的公共文件:P@Herbert这行得通吗?那将是有史以来最好的黑客攻击。
#定义private-public
并且你可以访问所有内容。我认为最后一句中有一个拼写错误。s/std::queue/std::deque/no?否则我同意。这个解决方案使优先级的使用更加安全。deque中的元素是按块分配的。这不是真的。你知道吗可以通过成员
c
访问基础容器。事实上这是标准的。@Elizafox:
c
成员受
保护
,您不能直接从自己的代码访问此成员,除非您从容器继承,并且使用自己的类型而不是
std::priority\u queue