2009-08-03 77 views
4

問題:我希望能夠對傳出消息進行FIFO排隊。出於更新/刪除的原因,我也希望能夠根據對象ID訪問隊列中的每條消息。如何實現排隊映射?

我目前已經實現了一個解決方案,其中數據被推送到一個deque中,並且保存了該數據的迭代器。迭代器由一個對象ID加密,然後放入一張地圖中。這在我做的一個地方很好,但我現在發現自己想在別處做這個。

我是否過度複雜化了這個問題?那裏有數據結構嗎?

+0

我認爲要做得更好,我們必須知道你在做什麼。通常當你將某物推入隊列時,你只關心前方。你不應該修改它。 – GManNickG 2009-08-03 17:46:54

回答

12

爲什麼不讓deque成爲ID和地圖從ID到對象的映射。然後,當您訪問雙流隊列中的ID時,可以在地圖中查找ID。如果這些ID是全球唯一的,那麼您只需要一張地圖來爲所有的deques服務。

+0

我剛開始避開這樣的解決方案,因爲它不允許我根據ID刪除隊列中的節點。然後我意識到這是沒有必要的。 當隊列最終處理節點時,映射數據可以決定要執行什麼操作。該密鑰已被刪除,或者調用數據對象決定不再需要處理。 – 2009-08-03 18:10:35

1

我會嘗試另一種方式。利用地圖作爲您的主要數據結構。讓隊列包含可用於從地圖中查找對象的對象ID。就迭代器等而言,您不需要追蹤所有額外的信息 - 只需要數據地圖和對象ID隊列。

  • 編輯 - 尼爾打我吧,道具去他:)
3

我用Boost.MultiIndex做一些非常相似。使用它,你可以擁有一個只有一次數據的容器,但它可以通過兩個(或更多!)外觀訪問:一個看起來像一個列表,另一個看起來像一張地圖。當使用一個門面擦除元素(例如,從列表中彈出)時,另一個視圖將被無縫地更新。

+0

與此相同,除了我使用boost.bimap(具有2個索引的地圖;一個用於優先級,另一個用於「ObjectID」)。 – timday 2009-08-04 12:42:04