2012-04-20 30 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