2009-08-03 21 views
4

問題:私はFIFOキュー発信メッセージを待ちたい。更新/削除の理由から、オブジェクトIDに基づいてキュー内のすべてのメッセージにアクセスできるようにしたいと考えています。キューに入れられたマップを実装する方法は?

私は現在、データが両端キューにプッシュされ、そのデータのイテレータが保持されるソリューションを実装しています。オブジェクトIDをキーとするイテレータは、マップに配置されます。これは私がやった1つの場所でうまくいたが、私は今どこからでもこれをやりたいと思っている。

問題を複雑にしていますか?すでにこれを行うデータ構造がありますか?

+0

私はこれをより良くするために、あなたが何をしているのかを知る必要があると思います。通常、キューに何かを押し込むと、前面だけが心配です。あなたはそれを変更する必要はありません。 – GManNickG

答えて

12

デキューをIDの両端キューにして、IDからオブジェクトにマッピングするのはなぜでしょうか。次に、両端キューのIDにアクセスすると、マップ内のIDを検索します。 IDがグローバルに一意である場合は、すべてのデキュを処理するためのマップが1つだけ必要です。

+0

私は最初にそのような解決策を避けました。なぜなら、IDに基づいてキュー内のノードを削除できないからです。それから私はこれが必要ではないことに気づいた。 キューが最終的にノードを処理すると、マップされたデータが何をすべきかを決定できます。キーが削除されたか、またはデータオブジェクトの呼び出しによって処理が不要になったと判断されました。 –

1

私は別の方法で作業してみます。マップをプライマリデータ構造として使用します。キューには、マップからオブジェクトを見つけるために使用できるオブジェクトIDが含まれています。イテレータなどの追加情報をすべて追跡する必要はありません。データのマップとオブジェクトIDのキューです。

  • 編集 - ニールはそれに私を打つ、小道具は彼に行く:)
3

私は非常によく似た何かをするBoost.MultiIndexを使用しています。これを使用すると、データを1回だけ持つコンテナを持つことができますが、2つ(以上)の ファサード(リストのように見えるものとマップとして動作するもの)からアクセスできます。 1つのファサード(たとえば、リストからポップアップ)を使用して要素を消去すると、もう一方のビューはシームレスに更新されます。

+0

同じですが、boost.bimap(2つのインデックスを持つマップ、優先度は1つ、もう1つは "ObjectID")を使用しました。 – timday

関連する問題