7

ベクトルと連結リスト

ベクトルは連続してメモリに格納されるため、配列と同様に、 を使用して任意の要素にアクセスできますoperator[]

リンクされたリストには、メモリに連続して格納できない可能性のある要素が含まれているため、イテレータを使用してポインタをたどってランダムな要素にアクセスする必要があります。

(あなたはおそらくすでにこれを知っていました。)

Priority Queのメリット

最近、スタックのように機能する「優先キュー」を発見しましたが、要素はpush()コンテナーに入れられ、この関数は、との比較に従ってそれらを順番に配置しoperator<ます。

イベントをテストし、イベントが発生するまでの残り時間に従ってキューに配置しているので、これは私にぴったりです。push()キューは、Iおよびpop()要素として自動的に並べ替えます。(ポッピングは順序に影響しません。) は書けるoperator<ので問題ありません。

解決できなかった問題

このイベント キューでできるようにする必要があることが 3 つあります。

1:) イベント キューでアイテムを検索します。これは標準ライブラリのアルゴリズムで実行できると思いますか? たとえば、「見つける」?そうでない場合は、ポイント 2 を実行できれば、自分で実装できます (下記参照)。

2:) キューを反復処理します。デフォルトの基になるコンテナーはstd::vector...基になるベクター内のランダムな要素にアクセスする方法はありますか? std::deque代わりに使用することを選択した場合はどうなりますか? 特定のイベント パラメータを変更するには、これを行う必要があります。(イベントはキューに入れられます。)例として、イベントを処理し、残りの各イベントの「time_to_event」パラメーターから一定の時間を減算する必要がある場合があります。この質問のため、これはできないと思います。

3:) 要素をキューから削除します。イベントを処理しているときに、他のイベントが無効になることがあるため、削除する必要があります。

ポイント1~3はできますか?私が持っているすべての情報はcplusplus.comstd::priority_queueからのものなので、デフォルトの答えは「いいえ」です。これらのことを行う方法はありません。3 つすべてを実行できない場合は、独自の Priority Queue ラッパーを作成する必要があると思います。(ああ退屈)

4

2 に答える 2

10

いいえ、 内のアイテムを反復処理することはできませんstd::priority_queue。サポートされているのは、アイテムの挿入と、最も優先度の高いアイテムの削除だけです。

より柔軟性が必要な場合はstd::make_heap、コンテナにヒープ構造を構築したりstd::push_heap、アイテムを追加std::pop_heapしたり、アイテムを削除したりするために使用することをお勧めします。

これらはコンテナに適用するアルゴリズムであるため、必要に応じてコンテナのイテレータを引き続き使用できます。ヒープ内のデータを変更する方法によっては、後でヒープを再構築する必要がある場合があります (ヒープ プロパティが適用されなくなった方法で変更した場合)。std::is_heap質問がある場合は、それをテストできます。

余談ですが、私たちの多くは、あなたがリンクしたサイトよりもhttp://www.cppreference.comの方が便利で正確だと感じています。

于 2013-08-28T16:23:51.203 に答える
1

Boost.Heapを見てください。少なくとも 2 つの問題 (反復と可変性) に対処しているようです。

于 2013-08-28T16:35:47.790 に答える