基礎となるコンテナとしてベクトルでpriority_queueを使用しています。ただし、ヒープのサイズは非常に大きくなると思います。動的ベクトル容量のサイズ変更に関する問題を認識しています。そのため、priority_queue の基礎となるベクターに十分なスペースを最初に割り当てる方法を探しています。これを達成するための提案はありますか?
ありがとう
基礎となるコンテナとしてベクトルでpriority_queueを使用しています。ただし、ヒープのサイズは非常に大きくなると思います。動的ベクトル容量のサイズ変更に関する問題を認識しています。そのため、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 クラスからの継承に不満がある場合は、プライベート継承を使用して、すべてのメソッドを宣言でpriority_queue
アクセスできるようにします。using
基になるコンテナーに直接アクセスして容量を変更することはできません。ただし、内部で使用されるコンテナをstd::deque
. std::deque
コンテナーは、ベクトルよりも若干遅くなる可能性がありますが (Big-O 表記ではありません)、既存のすべての要素を再配置する必要がないため、コンテナーの成長ははるかに高速です。
デビッドが示唆するように、 std::deque を使用することはおそらく良い解決策です。メモリ チャンクは十分に小さいため、通常、キューが増大している間、ほとんどのメモリを予約できます。ただし、これはより安全なソリューションであり、安全なソリューションではありません。
効率をあまり気にしない場合は、特大データ セット用の標準テンプレート ライブラリの実装であるstlxxlを使用できます。このようにして、割り当て可能なメモリはハード ドライブ全体になります (ライブラリは複数のハード ドライブまたはネットワーク ドライブもサポートします)。
使用reserve
機能:
std::vector<Type>::reserve(size_t size)
サンプル:
std::vector<int> vec;
vec.reserve(10000);
std::priority_queue<int> q (std::less<int>(), vec);
デビッドは、アレクセイの答えに対する彼のコメントで正しいです。ベクトルの実装がコピーに予約されているものを割り当てる可能性はあまりありません。したがって、これを行う独自のコンテナーを提供するか、priority_queue から継承して、基礎となるコンテナーで遊ぶメンバーをいくつか提供します。