2d(3d) 坐标的哈希图(即双精度向量)?

2024-03-31

我想知道是否有一个通用的全能解决方案hash map对于坐标(2d 或 3d,即双精度向量)?

一个例子here https://stackoverflow.com/questions/7222143/unordered-map-hash-function-c/7222212#7222212演示如何创建自定义哈希映射pair<int,int>, 但想出一张独特的地图似乎并不是一件容易的事pair<double,double>(可以代表二维坐标)size_t.

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

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


为了避免额外的依赖,您可以使用std::hash http://en.cppreference.com/w/cpp/utility/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()分别适当地散列和比较新密钥。

Cheers

EDIT :

  • 修改代码以使用自定义 TPPoint3D 类和统一函子类定义(均使用结构)。
  • 添加了简单的测试来验证哈希和等于函子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2d(3d) 坐标的哈希图(即双精度向量)? 的相关文章

随机推荐

  • return 语句之前/期间的 C 分段错误

    我在 return 语句之前打印要返回的值 并告诉我的代码打印在函数调用之后立即返回的值 但是 在第一个打印语句之后和第二个打印语句之前 我遇到了分段错误 还值得注意的是 这种情况总是发生在第三次调用该函数时 从来没有第一次或第二次 也从来
  • 修改访客的捆绑属性

    我应该如何从访问者内部修改顶点的捆绑属性 我想使用对图进行子脚本化的简单方法 但传递给访问者的图参数是 const 因此编译器不允许更改 我可以在访问者中存储对图表的引用 但这看起来很奇怪 A visitor which identifie
  • 计算 Java 对象的值?

    我有一个用于存储项目的 Java 对象 public class PaymentDetailsItem private String name private String amount private int quantity priva
  • 在 Excel5.php 中找不到类“PHPExcel”

    我在 PHPExcel 中收到以下错误 Fatal error Class PHPExcel not found in PHPExcel Reader Excel5 php on line 587 这很奇怪 因为我在网上搜索时没有遇到过它
  • 尽管 rake 路线中有一条路线,但没有路线匹配

    我变得奇怪ActionController RoutingError No route matches 可以生成路线 gt r Rails application routes gt r generate controller items
  • 通用语言对 PCRE(Perl 兼容正则表达式)有哪些支持?

    我对 PCRE Perl 兼容正则表达式 的强大功能很感兴趣 并且想知道它们是否有可能成为所有主要语言中事实上的方法 我对 Java 感兴趣 如果有必要 我准备使用图书馆 我也无法在 SO 中找到一个很好的页面来描述 PCRE 的优缺点 因
  • Web 服务存根生成 + android

    我想生成一个基于 android java 的 STUB 来访问所有 Web 服务 我尝试使用以下工具生成存根 1 用于 CLDC 的 Sun Java TM 无线工具包 2 5 2 01 2 ksoap2 生成 stub 0 1 SNAP
  • 我可以使用特征稀疏矩阵来满足一般存储需求吗

    我需要一个模板化的稀疏矩阵实现 但只是为了减少内存占用 not进行任何数值求解 所以我尝试使用 Eigen 尽管我不需要数学部分 为什么 它恰好就在我的机器上 而且我已经用它来做其他事情了 但我肯定不是本征专家 Context 我有一个类型
  • 使用 LINQ 查询初始化 List

    我正在初始化一个List
  • Perl chomp 将多位数字变成 1 或 0

    我遇到一种情况 我需要用 Perl 读取一个充满数字的文件 这本身工作得很好 但是当我尝试删除每一行时 它会将以前的 5 或 6 位数字变成 1 或 0 Ideas 我需要对数字进行咀嚼以将文件路径与它们组合起来 因此回车符是一个问题 你没
  • 如何从 BroadcastReceiver 发出通知?

    如何从 BroadcastReceiver 发出通知 不能使用大多数方法 也不能使用 this 我需要它来打开一个包含数据库信息的活动我已经做到了 但现在必须的方法不起作用 我不能使用 这个 In the onReceive方法你得到一个C
  • LibGDX 将 BitmapFont 绘制到中间位置(spritebatch)

    我想使用 BitmapFont 绘制一些文本 临时位置 然后绘制该位置的一部分 到最后的精灵批次 我当时正在考虑画画 到临时 spritebatch 但不可能 将 spritebatch 绘制到另一个上 我怎样才能做到这一点 您可以使用帧缓
  • C - 返回指向局部变量的指针的函数

    考虑以下代码 include
  • Oracle 10g PL/SQL Connect By Prior 返回同一行上的子级和父级

    Table1 Child Parent a Bob Chris 2 Chris Kate 1 Shane Lana 3 Nala Bob 4 Table2 b Talent 1 something 2 nothing 3 something
  • CurrentThreadTaskScheduler 未完成同步

    我尝试为视图模型编写单元测试 但在尝试验证 ICommand 调用异步方法两次时遇到了困难 我使用 Moq 作为我的依赖项 我像这样设置了异步方法 this communicationServiceFake Setup x gt x Wri
  • 将列表的 2 个数据框中的因子转换为数值

    我在将列表中 2 个数据框的列转换为数字时遇到问题 现在两个数据框都有 2 列由因素组成 我想将它们转换为数字 以便我可以对它们进行数学运算 下面是示例代码 library XML bal lt http www baseball refe
  • 为什么不总是使用 HTTP post 进行 ajax 调用?

    我知道 HTTP get 和 post 方法之间的区别 如详细信息中所述this https stackoverflow com questions 46585 when do you use post and when do you us
  • 如何在 GWT 中实现 JQueryUI 滑块

    我最近需要在 GWT 中实现一个滑块来捕获用户在任务上取得的进度百分比 我对 GWT 孵化器中的滑块并不满意 并且不太热衷于使用 spiffy UI 或 SmartGWT 等外部库 我可以使用哪些替代方案在 GWT 中实现有效的滑块 而不需
  • Spark:在不更改列的可为空属性的情况下转换小数

    将列转换为DecimalType in a DataFrame似乎改变了可为空的属性 具体来说 我有一个不可为空的类型列DecimalType 12 4 我把它投射到DecimalType 38 9 using df withColumn
  • 2d(3d) 坐标的哈希图(即双精度向量)?

    我想知道是否有一个通用的全能解决方案hash map对于坐标 2d 或 3d 即双精度向量 一个例子here https stackoverflow com questions 7222143 unordered map hash func