【问题标题】:How do I get old C++ code which uses hash_map to build?如何获取使用 hash_map 构建的旧 C++ 代码?
【发布时间】:2019-11-21 16:52:06
【问题描述】:

显然,C++ 标准库的 STL 前身曾经将基于哈希的容器包含在名为 hash_map.h 的头文件中(具体来说,我猜是 hash_map 容器)。但是 - C++ standard library does not have a <hash_map>;和 AFAIK unordered_map 不完全一样。

现在,我正在尝试构建这个旧代码库,我刚刚注意到它包含 <hash_map.h>。

假设我在 AMD64 机器上使用 Devuan Beowulf (~= Debian Buster) Linux,我应该怎么做才能构建代码?

注意事项:

  • 我不想复制一个完整的 10 年前的开发环境;这个代码库最终应该可以使用我的(或任何现代的)Linux 发行版构建。
  • 我愿意:

    • 对代码进行细微更改。
    • 安装一些适合分发的软件包。
    • 在/usr/local下安装一些东西


    按偏好降序排列。

【问题讨论】:

  • 如果您对hash_map< 进行全局搜索并替换为unordered_map,会发生什么情况。同样将#include <hash_map.h> 替换为#include <unordered_map>。它不会起作用吗?也许?
  • @selbie:由于其他原因,该代码现在无法构建。我想知道您的建议是应该起作用,还是已知通常起作用;如果没有,有什么注意事项。
  • 至少有一个网页表明 hash_map 是与线程同步的。假设您不依赖于没有锁的多个线程访问 hash_maps,我认为您会没事的。即使你引入了 hash_map 的替代实现,你仍然需要以类似的方式测试你的代码。
  • 你在散列什么?有一流的免费算法,测试得比大多数人预期的要好。标准库通常是懒惰的。散列int 是一种无操作,导致传播不良。有足够熟练的人来正确地做到这一点。灵感:mostlymangling.blogspot.com 您是否需要一些适合旧方案的散列或一个效果很好的替代品?查看博客和对“随机”的引用。即插即用。有趣的是,即使编译需要时间,您实际上也可以constexpr 很多情况:)
  • 如果你需要一个 <hash_map> 标头,它的功能可以使其余代码满意,我想我可以提供。只需提供您需要的签名即可。

标签: c++ stl hashmap c++-standard-library


【解决方案1】:

取决于你愿意做多少工作,以及你对这个代码库的未来计划。

你可以:

  • 找到具有<hash_map> 的旧编译器并安装它。我建议使用 10 年前的 gcc 版本。
  • 找到一个不同的代码块来做你想做的事。
  • 将hash_map的所有用法都改成unordered_map,然后找出还需要更改的地方。

【讨论】:

  • 只有选项 3 是相关的。但是 - 你能保证unordered_map 的行为类似于hash_map(当然忽略实现细节)?
  • 否;您不能保证它们的行为相同。我相信他们的行为“相似”,但那不一样。如果我认为它们是相同的,我就不会在我的答案中添加“弄清楚还有什么需要改变”
  • 我不认为在某处有关于它们有何不同的描述......?另外 - Boost ASIO 似乎有一个 hash_map;那不行吗?
  • @einpoklum SGI 文档 (sgi.com/tech/stl/hash_map.html) 被撤下,但似乎有人将其托管在他们的网站上 (martinbroadhurst.com/stl/hash_map.html)。该文档可能有助于确定两者的接近程度。
  • 如果您要移植到其他未标准化的 hash_map 实现,您不妨只转换为 。
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多