2012-04-20 31 views
2
typedef boost::unordered_map<int, void*> OneDimentionalNodes; 
typedef boost::unordered_map<int, OneDimentionalNodes> TwoDimentionalNodes; 

TwoDimentionalNodes nodes; 

這個有效嗎?二維無序圖

我不使用任何散列函數,因爲unordered_maps'的鍵是單個整數。它會編譯,但是當我像這樣迭代它時,它試圖訪問this-> hash_function()(k)時崩潰。

for (TwoDimentionalNodes::iterator it= nodes.begin(); it != nodes.end() ; ++it) 
{ 
    for(OneDimentionalNodes::iterator it2 = nodes[it->first].begin(); it2 != nodes[it->first].end() ; ++it2) 
    { 
    // do stuff 
    } 
} 

我也開放給其他容器用

  • O(1)訪問
  • O(n)的迭代
  • 稀疏
+0

Dimen * s *離子。另外,爲什麼不去'it2-> second.begin()'? – Puppy 2012-04-20 11:09:02

+0

我也試過了2 - > second.begin()。這是相同的結果。 – mikbal 2012-04-20 11:10:41

+0

您可以通過包含來使用std :: unordered_map,它帶有C++ 11,但與boost :: unordered_map相同。向我們展示你的'this-> hash_function()(k);'代碼 – k06a 2012-04-20 11:11:00

回答

3

如果你只需要迭代器對所有元素,它不是在一個特定的空間需要循環,那麼你可以使用一個簡單的對作爲關鍵的unordered_map,像這樣:

typedef std::pair<int,int> Coordinates; 
typedef std::unordered_map<Coordinates,void *> TwoDimensionalNodes; 

(請注意,我用STL的替代加速,unordered_map現在也是標準STL的一部分)。

獲得一個特定的值,簡單地寫:

twoDimensionalNodes[std::make_pair(x,y)] 

(或使用發現,如果你不知道這值是在你的地圖)。

要重複,只是遍歷無序地圖:

for (auto it=twoDimensionalNodes.begin();it!=twoDimensionalNodes.end();++it) 
    { 
    std::cout << "x=" << it->first.first; 
    std::cout << "y=" << it->first.second; 
    std::cout << "value=" << it->second; 
    } 

爲了使它有點更具可讀性,我更喜歡從迭代器首先得到的座標,就像這樣:

for (auto it=twoDimensionalNodes.begin();it!=twoDimensionalNodes.end();++it) 
    { 
    Coordinates &coordinates = it->first; 
    std::cout << "x=" << coordinates.first; 
    std::cout << "y=" << coordinates.second; 
    std::cout << "value=" << it->second; 
    } 

如果你有2個以上的維度,使用std :: tuple,或者直接編寫自己的Coordinates類作爲地圖的關鍵字。

+0

順便說一句,你需要專門爲你的配對使用'std :: hash',因爲這很不幸從標準中忽略掉了。另一方面有助於它。 – 2012-04-20 11:47:20

+0

對更好。我沒有std :: unordered_map,但它的工作完美與boost :: unordered_map,謝謝你 – mikbal 2012-04-20 12:13:42

+0

@Christian:我不知道你必須專門化std ::哈希,如果你使用一對作爲關鍵。謝謝。 – Patrick 2012-04-20 12:17:31

1

使用std::unordered_map<unordered_map>。 嘗試特化std散列類這樣:

namespace std 
{ 
    template<typename T> 
    struct hash<void*> 
    { 
     std::size_t operator()(void * ptr) const 
     { 
      return (std::size_t)ptr; 
     } 
    }; 
} 
+0

呵呵?他使用'int'作爲鍵,爲此應該已經有一個'hash'特化(反正也應該有一個指針)。那麼多個嵌套的'stl'命名空間呢?如果這是一個單一的'std'命名空間(他使用boost,無論如何,Ok應該在那裏工作)? – 2012-04-20 11:44:46