二维unordered_map

时间:2012-04-20 11:02:53

标签: c++ 2d unordered-map

typedef boost::unordered_map<int, void*> OneDimentionalNodes;
typedef boost::unordered_map<int, OneDimentionalNodes> TwoDimentionalNodes;

TwoDimentionalNodes nodes;

这是有效的吗?

我不使用任何散列函数,因为unordered_maps'的键是单个整数。 它编译,但当我像这样迭代时,它在尝试访问时崩溃 - &gt; 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)迭代
  • 稀疏

2 个答案:

答案 0 :(得分:3)

如果你只需要对所有元素进行迭代,并且不需要遍历特定维度,那么你可以使用一个简单的对作为unordered_map的键,如下所示:

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

(注意我使用的是STL而不是Boost,unordered_map现在也是标准STL的一部分。)

获取特定值只是写作:

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

(如果您不确定该值是否在地图中,请使用find。)

要迭代,只需迭代无序地图:

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类作为地图的关键字。

答案 1 :(得分: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;
        }
    };
}