2011-09-03 29 views
0

我需要一個應用程序的空間映射。我找到了Boost.MultiIndex。
我跟着它tutorial並瞭解如何創建類型:Boost.MultiIndex空間操作

typedef boost::multi_index_container<MapNode, 
    indexed_by< 
     ordered_non_unique<member<MapNode, int, &MapNode::X>>, 
     ordered_non_unique<member<MapNode, int, &MapNode::Y>> 
    > 
> Map_T; 

以及如何插入到它:

Map.insert(Node); 

如何取回基於其xy座標的值?我如何檢查這裏是否有價值?

+0

'Boost.MultiIndex'可能不是這個正確的容器。使用'Boost.MultiIndex',您可以獲得按'x'排序的節點視圖,或者按y排序的節點,但是您無法在特定的'x'和'y'處找到節點(沒有通過一個線性搜索的意見)。 'Boost.MultiArray'可能更適合您的需求。 – Mankarse

回答

0

首先,你不需要boost :: multi_index來解決這個問題。簡單地爲您的類型MapNode重載運算符<,並使用std :: set(如果具有相同座標的多個節點可以發生,則使用std :: map)。 Therby,操作者<首先比較(例如)x值。如果它們相等,則繼續比較y座標。

使用boost :: multi_index只有一個原因:如果需要不同的訪問方法。例如,如果您想要一個額外的「視圖」,其中節點首先按y排序,然後再按x排序。 但是,multi_index的成員方法(如上面的代碼中所示)不是一個好主意。使用身份兩次,但提供兩種不同的比較功能。詳情可以在boost文件中找到。

最後,所有這些認可可能不是最好的 - 這取決於您的應用。專門的數據結構是例如在Berg等人的書「Computational geometry」中有描述。人。 Unfortunaetlly,我不知道這些算法的任何自由執行...

+0

感謝您的回答,我已經使用hashmap與prime hash函數相乘 – Dani