CPP:使用地图进行多维度?

时间:2015-06-24 19:48:44

标签: c++ multidimensional-array data-structures

我想构建一个3D网格并使用一个多维地图来保存节点,例如:

std::map<double, std::map<double, std::map<double, pathplanning::Node*> > >

三个双精度数是网格中的(x,y,z)位置,Node数据类型是一个简单的类,它会封装一些信息。

我是cpp社区的新人,我想问:这是一个好方法吗?或者我应该使用一些不同的数据结构?这就是为什么我不使用多维数组:位置可能是负数,数组索引不能。

3 个答案:

答案 0 :(得分:3)

我的意见不是。

使用std :: map(不带指针)。 vector3d是以某种方式保持3个双重排序的任何结构。可能性是

struct vector3d
{
   double x ;
   double y ; 
   double z ;
} ;

bool operator<(const vector3d lhs, const vector3d &rhs)
{
   if (lhs.x != rhs.x)
      return lhs.x < rhs.x ;
   if (lhs.y != rhs.y)
      return lhs.y < rhs.y ;
    return lhs.z < rhs.z ;
}

答案 1 :(得分:3)

该数据结构可以很好,您可以考虑存储智能指针而不是原始指针,而不是手动处理内存管理。但取决于情况,使用具有三个坐标的结构作为单个地图的关键可能更有效:

struct 3d {
    double x, y, z;
    bool operator<( const 3d &r ) const;
}

std::map< 3d, pathplanning::Node*> map;

std::tuple<double, double, double>也可以使用。这将消除2个额外的数据访问查找,并且可能更加缓存友好。

另一方面,如果您需要表现但不关心订单,您可以考虑std::unordered_map,但在这种情况下,您必须对3d结构实施std::hash专业化。或者您可以使用3个嵌套std::unordered_map

答案 2 :(得分:2)

你也可以尝试使用unordered_multimap< gridPos, pathfinder::Node* >并使用3D gridPos的映射函数到1D,可以在这里找到一篇关于如何使用哈希表执行此操作的好文章({{3} })。

有关如何为STL容器编写自定义哈希函数的说明,您可以访问http://matthias-mueller-fischer.ch/publications/tetraederCollision.pdf并按照其中提供的建议进行操作。

然后在多图中,您可以根据需要存储pathfinder::Node数据或指针,并使用1D gridPos到3D的映射来查询结构。

希望有所帮助。