我想构建一个3D网格并使用一个多维地图来保存节点,例如:
std::map<double, std::map<double, std::map<double, pathplanning::Node*> > >
三个双精度数是网格中的(x,y,z)位置,Node
数据类型是一个简单的类,它会封装一些信息。
我是cpp社区的新人,我想问:这是一个好方法吗?或者我应该使用一些不同的数据结构?这就是为什么我不使用多维数组:位置可能是负数,数组索引不能。
答案 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的映射来查询结构。
希望有所帮助。