二维unordered_map(Two dimensional unordered_map)

2019-09-16 15:56发布

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

TwoDimentionalNodes nodes;

这是有效的?

由于unordered_maps'的关键是单一的整数我不使用任何散列函数。 它编译,但是当我遍历它像这样,它试图访问这个 - 崩溃> 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)的迭代

Answer 1:

如果你只需要在迭代器的所有元素,而且它不是在一个特定的尺寸要求的循环,那么你可以使用一个简单的对作为重点为您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 ::元组,或者干脆写自己的坐标类被用作地图的关键。



Answer 2:

使用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;
        }
    };
}


文章来源: Two dimensional unordered_map