我想要构建一个三维网格,并使用一个多维地图,它保存节点,类似于:
std::map<double, std::map<double, std::map<double, pathplanning::Node*> > >这三个双倍是(x,y,z)在网格中的位置,Node数据类型是一个简单的类,它包含了一些信息。
我是cpp社区的新手,我想问:这是个好方法吗?还是应该使用不同的数据结构?这就是为什么我不使用多维数组:位置可能是负值,数组索引不能。
发布于 2015-06-24 19:56:59
我的意见是否定的。
使用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 ;
}发布于 2015-06-24 19:57:56
数据结构可以很好,您可以考虑存储智能指针,而不是原始指针,而不是手动处理内存管理。但视情况而定,使用三个坐标的结构作为单个地图的关键可能更有效:
struct 3d {
double x, y, z;
bool operator<( const 3d &r ) const;
}
std::map< 3d, pathplanning::Node*> map;std::tuple<double, double, double>也可以使用。这将消除两个额外的数据访问查找,并可能是更友好的缓存。
另一方面,如果您需要性能,但不关心顺序,您可以考虑std::unordered_map,但在这种情况下,您必须为3d结构实现std::hash专门化。或者您可以使用3个嵌套的std::unordered_map。
发布于 2015-06-24 20:14:56
您还可以尝试使用unordered_multimap< gridPos, pathfinder::Node* >并使用3D gridPos到1D的映射函数,在这里可以找到一篇关于如何使用哈希表实现此操作的好文章(http://matthias-mueller-fischer.ch/publications/tetraederCollision.pdf)。
有关如何为STL容器编写自定义散列函数的说明,您可以访问http://www.drdobbs.com/windows/user-defined-hash-functions-for-unordere/231600210并遵循这里提供的建议。
然后,在multimap中,您可以根据需要存储pathfinder::Node数据或指针,并使用一维gridPos到3D的映射查询结构。
希望这能有所帮助。
https://stackoverflow.com/questions/31035683
复制相似问题