如何在 boost::unordered_map 中使用自定义类型的键?

2024-01-17

我现在正在项目中使用 Boost 的哈希映射实现,并且我正在尝试实现键的自定义类型。我有四个无符号整数,我想将它们组合成一个 128 位数据类型以用作密钥。

我创建了一个包含四个元素的 32 位整数数组的结构,用作我的存储。老实说,我不确定Boost的哈希图是如何工作的,所以我不确定我在这里做什么,但我遵循了Boost文档(http://www.boost.org/doc/libs/1_37_0/doc/html/hash/custom.html http://www.boost.org/doc/libs/1_37_0/doc/html/hash/custom.html)用于扩展 boost::hash,我创建了一个哈希函数以及一个自定义比较运算符。

我在标头中定义了此自定义类型。这是我的代码:

#ifndef INT128_H_
#define INT128_H_

// Custom 128-bit datatype used to store and compare the results of a weakened hash operation.
struct int128
{
    unsigned int storage[4];

    /* Assignment operation that takes a 32-bit integer array of four elements.
    This makes assignment of values a shorter and less painful operation. */
    void operator=(const unsigned int input[4])
    {
        for(int i = 0; i < 4; i++)
            storage[i] = input[i];
    }
};

bool operator==(int128 const &o1, int128 const &o2)
{
    if(o1.storage[0] == o2.storage[0] && o1.storage[1] == o2.storage[1] && 
       o1.storage[2] == o2.storage[2] && o1.storage[3] == o2.storage[3])
        return true;

    return false;
}

// Hash function to make int128 work with boost::hash.
std::size_t hash_value(int128 const &input)
{
    boost::hash<unsigned long long> hasher;
    unsigned long long hashVal = input.storage[0];

    for(int i = 1; i < 3; i++)
    {
        hashVal *= 37;
        hashVal += input.storage[1];
    }

    return hasher(hashVal);
}

#endif

现在,当我在 Boost 的无序映射中实际使用这种类型时,我的代码可以编译,但无法链接。链接器声称我在多个目标文件中多次定义了一个符号。我真的很想让我的 128 位类型与这张地图一起工作。关于我搞砸的事情有什么建议,或者更好的方法吗?


无序映射的参与几乎是您遇到的问题的偶然。真正的问题是你正在定义hash_value and operator==在包含上述标头的每个文件中。

您可以通过以下任一方法解决此问题:

  1. 将它们定义为内联函数
  2. 只需在标头中声明它们

如果您执行后者(这就是您通常想要的),您将把这些函数的定义移动到.cpp文件(或任何用于 C++ 源文件的扩展名)。然后,您将编译该文件,并将生成的对象与使用 int128 类型的其他代码链接。

编辑:您仍然可以使比较更清晰,例如:

bool operator==(int128 const &o1, int128 const &o2)
{
    return o1.storage[0] == o2.storage[0] && o1.storage[1] == o2.storage[1] && 
           o1.storage[2] == o2.storage[2] && o1.storage[3] == o2.storage[3]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 boost::unordered_map 中使用自定义类型的键? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • MSBuild 使用 ItemGroup 和 EXEC 命令

    我创建了代码片段中显示的 ItemGroup 我需要迭代此 ItemGroup 并运行 EXEC 命令 也在代码片段中显示 我似乎无法让它发挥作用 代码返回如下所示的错误 注意 消息被写入 2 次 这是正确的 但 EXEC 命令未正确运行
  • AWK - 是否可以按不同字段&&按小时细分日志文件

    Question 我想知道是否可以awk独自闯入 一个日志文件 然后有awk输出一条不同的消息 小时细分 00 23 以及该特定时间的计数 小时与不同的消息 Example 请求的输出 Message1 00 13 01 30 23 6 M
  • WPF .NET4.0 重用 UserControl 的相同实例

    我想显示用户控件的同一实例两次 我尝试过执行以下操作
  • Javascript 和 CSS 文件在 Maven 构建中组合,无需压缩、缩小等

    有没有一个 Maven 插件只结合了 js 和 css 资源 但不做任何缩小 混淆 压缩等操作 只是简单的资源串联 对您的项目进行以下更改 In your pom xml
  • 在linux中设置java_home和path环境变量[重复]

    这个问题在这里已经有答案了 我下载了 java 8 和 amd 组合包 以便在 Linux 中使用 Cassandra 当我运行 cassandra 时 它显示为 无法找到 java 可执行文件 检查JAVA HOME和PATH环境变量 如
  • 使用系统数据源而不是用户数据源作为 ODBC 连接字符串

    OdbcConnection DbConnection null try DbConnection new OdbcConnection Driver SQL Anywhere 10 Uid user pwd pass Dsn
  • 了解 Elixir 函数参数中的模式匹配

    在 Elixir in Action 一书中 其中一个示例的一个函数颠覆了我对模式匹配的理解 def add entry TodoList entries entries auto id auto id todo list entry do
  • 从 BitBucket Rest API v2.0 获取文件

    我有一个脚本 它使用 bitbucket REST API 1 0 从 GIT 获取文件 但它最近停止工作 我推测这可能是由于 v1 REST API 被贬值所致 但我不确定 无论如何 我正在尝试使用新的 2 0 REST API 检索文件
  • 具有并行命令的 Jenkins 管道

    我有这个基本的詹金斯管道 注 我省略了subJobParams使代码更小 pipeline agent any stages stage stage1 steps script parallel mongoParallel build jo
  • 将日期从 Excel 文件转换为 pandas

    我正在导入Excel文件 其中 日期 列有不同的书写方式 Date 13 03 2017 13 03 2017 13 03 2017 13 03 2017 10 3 17 10 3 17 9 3 17 9 3 17 9 3 17 9 3 1
  • CSS在确定父级大小时忽略一个元素[重复]

    这个问题在这里已经有答案了 基本上 我怎样才能实现这一目标 div div class ignoreWidth style width 20px 20px div div style width 4px 4px div div style
  • 捕获除重置之外的所有事件

    我想捕获除 重置 之外的所有事件 我在视图中初始化了这样的代码 messagesCollection on all handleMessageChanges 现在它适用于所有事件 正如我上面提到的 我不需要捕获重置事件 我该如何解决这个问题
  • UIPanGestureRecognizer 在 iOS 13 中无法工作

    我们在 iOS 12 中开发了一款应用程序 运行得非常好 现在 在 iOS 13 中 UIPanGestureRecognizer 不再工作 我已经寻找解决方案但没有找到任何东西 IBAction func handlePan recogn
  • C++ 中运算符重载中的参数数量

    我正在学习 C 并且创建了两个简单的 hello world 应用程序 在这两个例子中我都使用了运算符重载 但问题就在这里 对于第一个 我可以为重载运算符提供两个参数 这很好 Header enum Element a b c d e El
  • VB.NET 迭代结构对象

    我有一个结构 xyz 其中有 3 个字符串对象 foo bar 和 abc 我想迭代结构并比较对象的名称 Structure xyz dim foo as string dim bar as string dim abc as string
  • INSERT INTO SELECT 给出:列名称或提供的值的数量与表定义不匹配

    执行下面的代码时我收到此错误消息 列名称或提供的值的数量与表定义不匹配 DROP TABLE UniqueBuildingUsageFkAndBuildingFk CREATE TABLE UniqueUsageFkAndBuildingF
  • JavaScript 有编码标准吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Mongoose 之上使用 Joi 进行验证是一个好的实践吗?

    我正在使用 Node js Mongoose 和 Koa 开发 RESTful API 但在架构和输入验证方面 我对最佳实践有些困惑 目前 我对每个资源都有 Mongoose 和 Joi 模式 Mongoose 架构仅包含有关特定资源的基本
  • Flutter 中的变换手势检测器(带堆栈)

    在我的代码中 我使用手势检测器在用户拖动时拉出菜单 但是当我向上拉菜单时 GestureDetector 的碰撞盒不会改变 所以当我想把它放回去时 它只记录在初始碰撞盒上的拖动 而不是新的碰撞盒 我将小部件转换为的位置 我希望你能理解这一点
  • 如何在 boost::unordered_map 中使用自定义类型的键?

    我现在正在项目中使用 Boost 的哈希映射实现 并且我正在尝试实现键的自定义类型 我有四个无符号整数 我想将它们组合成一个 128 位数据类型以用作密钥 我创建了一个包含四个元素的 32 位整数数组的结构 用作我的存储 老实说 我不确定B