簡體   English   中英

C ++ priority_queue底層向量容器容量調整大小

[英]C++ priority_queue underlying vector container capacity resize

我正在使用priority_queue將vector作為底層容器。 但是我希望堆的大小非常大。 我知道動態矢量容量調整大小的問題。 所以我正在尋找最初為priority_queue中的底層向量分配足夠空間的方法。 有什么建議可以實現這個目標嗎?

謝謝

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類繼承感到不滿,請使用私有繼承,並using聲明使priority_queue所有方法都可訪問。

您無法直接訪問基礎容器來修改容量。 但是,您可以將內部使用的容器更改為std::deque std::deque容器可能比矢量略慢(不是大O表示法),但是增長速度要快得多,因為它不需要重新定位所有現有元素。

使用reserve功能:

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

樣品:

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

David對Alexey的回答是正確的:向量實現將分配副本上保留的內容的可能性不大。 因此要么提供自己的容器來執行此操作,要么從priority_queue繼承並提供一些成員來使用底層容器。

正如David所說,使用std :: deque可能是一個很好的解決方案。 內存塊足夠小,通常允許您在隊列增長時保留大部分內存。 但它只是一個更安全的解決方案,但不是一個安全的解決方案。

如果您不太關心效率,可以使用stlxxl,它是超大型數據集的標准模板庫的實現。 這樣可分配內存將成為您的整個硬盤(該庫還支持多個硬盤或網絡驅動器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM