Two dimensional unordered_map

Two dimensional unordered_map

本文关键字:map unordered dimensional Two      更新时间:2023-10-16
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) 迭代
  • 稀疏

如果你只需要迭代所有元素,并且不需要循环到一个特定的维度,那么你可以使用一个简单的对作为你的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)]

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

要迭代,只需迭代无序映射:

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,或者干脆编写自己的坐标类以用作地图的键。

使用 <unordered_map> 中的std::unordered_map。尝试以这种方式专门化标准哈希类:

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