gpt4 book ai didi

c++ - 2d(3d) 坐标的 HashMap (即 double vector )?

转载 作者:搜寻专家 更新时间:2023-10-30 23:48:17 25 4
gpt4 key购买 nike

我想知道是否有针对hash map的通用全能解决方案?对于坐标(2d 或 3d,即 double vector )?

一个例子 here演示如何为 pair<int,int> 创建自定义 HashMap ,但是从 pair<double,double> 想出一张独特的 map 似乎并不简单(可以表示二维坐标)到 size_t .

我知道我可以通过提供比较器对象来使用有序映射,但对于我的应用程序来说,不需要对它们进行排序,而且散列映射似乎更快。然而,由于我是这一切的新手 hash东西,我有点迷失了如何进行。

p/s/我使用 C++11。

最佳答案

为了避免额外的依赖,你可以使用 std::hash .这是一个使用您发布的链接中的代码的示例,并更新为使用 std::pair<double,double> :

#include <unordered_map>
#include <cassert>

using namespace std;

class TPoint3D{
public:
TPoint3D(double x, double y, double z) : x(x), y(y), z(z){};

double x, y, z;
};

struct hashFunc{
size_t operator()(const TPoint3D &k) const{
size_t h1 = std::hash<double>()(k.x);
size_t h2 = std::hash<double>()(k.y);
size_t h3 = std::hash<double>()(k.z);
return (h1 ^ (h2 << 1)) ^ h3;
}
};

struct equalsFunc{
bool operator()( const TPoint3D& lhs, const TPoint3D& rhs ) const{
return (lhs.x == rhs.x) && (lhs.y == rhs.y) && (lhs.z == rhs.z);
}
};

typedef unordered_map<TPoint3D, int, hashFunc, equalsFunc> TPoint3DMap;

int main(){
TPoint3DMap myMap;

// test equalsFunc
myMap[TPoint3D(10.0, 20.0, 30.0)] = 100;
myMap[TPoint3D(10.0, 20.0, 30.0)] = 200;

assert(myMap[TPoint3D(10.0, 20.0, 30.0)] == 200);

// test if hashFunc handles well repeated values inside TPoint3D
myMap[TPoint3D(10.0, 10.0, 10.0)] = 1;
myMap[TPoint3D(10.0, 20.0, 10.0)] = 2;
myMap[TPoint3D(10.0, 10.0, 20.0)] = 3;
myMap[TPoint3D(20.0, 10.0, 10.0)] = 4;

assert(myMap[TPoint3D(10.0, 10.0, 10.0)] == 1);
assert(myMap[TPoint3D(10.0, 20.0, 10.0)] == 2);
assert(myMap[TPoint3D(10.0, 10.0, 20.0)] == 3);
assert(myMap[TPoint3D(20.0, 10.0, 10.0)] == 4);

return 0;
}

正如我之前所说,如果你想使用另一种结构,你必须同时调整 pairHash类和 pairEquals结构 operator()分别适本地散列和比较新 key 。

干杯

编辑:

  • 修改代码以使用自定义 TPPoint3D 类和统一仿函数类定义(均使用结构)。
  • 添加了简单的测试来验证散列和等于仿函数。

关于c++ - 2d(3d) 坐标的 HashMap (即 double vector )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16792751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com