首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPP:使用地图进行多维分析?

CPP:使用地图进行多维分析?
EN

Stack Overflow用户
提问于 2015-06-24 19:48:44
回答 3查看 375关注 0票数 2

我想要构建一个三维网格,并使用一个多维地图,它保存节点,类似于:

代码语言:javascript
复制
std::map<double, std::map<double, std::map<double, pathplanning::Node*> > >

这三个双倍是(x,y,z)在网格中的位置,Node数据类型是一个简单的类,它包含了一些信息。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-24 19:56:59

我的意见是否定的。

使用std::map (没有指针)。vector3d是以某种方式保持3双有序的任何结构。有可能是

代码语言:javascript
复制
struct vector3d
{
   double x ;
   double y ; 
   double z ;
} ;

使用一个

代码语言:javascript
复制
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 ;
}
票数 3
EN

Stack Overflow用户

发布于 2015-06-24 19:57:56

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

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 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的映射查询结构。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31035683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档