【问题标题】:Equivalent of C++11 unordered_map for an older version of C++ [closed]等效于旧版本 C++ 的 C++11 unordered_map [关闭]
【发布时间】:2018-10-11 05:56:33
【问题描述】:

对于旧版本的 C++²,C++11 std::unorderd_map¹ 的等价物是什么?我试过std::tr1::unordered_map,不幸的是我的编译器不支持它。


¹ 我真的需要 unordered_map 的好处,即平均 O(1) 时间访问。

² 我正在打印__cplusplus,上面写着1。我不确定编译器符合哪个 C++ 标准。

【问题讨论】:

  • 什么是c++1
  • 无论您的__cplusplus 宏扩展为什么,都没有“C++1”之类的东西。获取编译器版本的更好方法是通过编译器的命令行选项(如果有)。
  • @NickyC 你能在我之前的评论中回答我的问题吗?说没有 std::unordered_map 的旧版本 (c++, compiler) 有意义吗?
  • 我已经回答你了。
  • 我假设您使用的是旧版本的 GCC - 4.7 之前的 GCC 版本有一个错误,即 __cplusplus 宏的值将是 1 而不是 199711L。您不能使用比至少使用 4 年的 GCC 更新的编译器来编译您的代码吗?

标签: c++ hashmap unordered-map


【解决方案1】:

如果您的编译器确实在编译 C++ 代码时为您提供 __cplusplus 的值 1,则它不符合标准(a)。 p>

在为 C++11 之前的编译器获取无序映射实现方面,您可能需要研究 Boost - 标准 C++ 中的大部分内容首先出现在 :-) un-ordered map早在 2008 年的 Boost 1.36 就可以使用,因此对于至少符合 C++03 的编译器来说应该没问题。

此外,尽管 Boost 的部分 需要构建到库中,但无序映射不是这些部分之一。作为header-only feature,您只需在代码中包含头文件并使用它。例如,下面的程序打印 Hello, world. 绝对 no 包含额外的库(我使用 very 基本的g++ -o testprog testprog.cpp 来编译它):

#include <iostream>
#include <boost/unordered_map.hpp>
int main() {
    boost::unordered_map<std::string, std::string> x;
    x["hi"] = "Hello";
    x["planet"] = "world";
    std::cout << x["hi"] << ", " << x["planet"] << ".\n";
}

如果出于某种原因,Boost 不适合,则标准无序映射的属性基本上是所有事物的平均恒定时间复杂度,因此几乎任何半体面的哈希表实施也应该是可行的。但我会在你无法让 Boost 工作的情况下走这条路 - 我更喜欢它只是基于其已知的代码质量。


(a) 标准的每次迭代(至少从 C++98 开始)都应该有一个非常具体的值集,例如按照 C++11 标准:

在编译 C++ 翻译单元时,名称 __cplusplus 被定义为值 201103L

每次迭代的值应该是:

pre-C++11  199711L
    C++11  201103L
    C++14  201402L
    C++17  201703L

可能它可能不符合的原因是您使用的是 g++ 的 4.7 之前的变体 - 有一个十年前的错误报告了 __cplusplus版本为 1 而不是“正确”值。

【讨论】:

  • @paxdialo 忘记 c++1。那不是我原来的问题。我的意思是没有 std::unordered_map 的旧版 c++。您可以在这种情况下发布答案吗?
  • @MasterJEET,已不再强调__cplusplus 问题,请阅读更新以查看它是否有用。
  • @paxdialo 信息量很大。现在我知道旧的c++ 没有任何 unordered_map 等效项。根据我的第三个描述,boost 不是一个选项。
  • @MasterJEET,Boost 的大部分内容实际上是只有标题的东西,包括无序的地图。不需要构建或使用库,只需包含标题即可。会澄清的。
  • @paxiablo 我已将 subjectivity 排除在外,因为它不符合社区标准,并将其发布在这里,这样没人会想知道你为什么要打扰描述这么多。 --- 如果没有这样的东西,那么是否有任何我可以使用的首选开源实现?当我说开源实现时,我并不是指我可以添加到我的项目中的任何第三方库。相当完整的源代码,我可以放入我的代码中。可能这就是为什么我不能使用boost
【解决方案2】:

您似乎在使用旧的/奇怪的/不合格的编译器和/或标准库。 __cplusplus 宏应定义为一个整数,该整数表示 YYYYMM 日期,表明支持的 C++ 标准。

除了使用现代编译器和标准库之外,您还有一些 C++11 std::unordered_map 的替代方案,例如哈希映射实现:

  • std::tr1::unordered_map:C++11版本的前身,如果你的std lib支持的话。
  • Boost.Unordered 提供的 boost::unordered_map 只需要 C++98 编译器,并尽可能地模仿现代 std::unordered_map 的接口。

【讨论】:

  • std::tr1::unordered_map 我试过了,一个最小的谷歌搜索将返回要求你尝试的链接。在那之后我才在这里。您提到的仍然很好,对其他人有用。对于boost,我不需要预编译库吗?因此不符合我的第三个描述点。事实上,我包括了我的第三个描述,记住人们会建议boost
  • 好吧,如果你想明确排除 Boost,你为什么不在你的问题中这么说呢?不,编译是没有必要的。 Boost.Unordered 只是标题。
  • 好吧,当我上次发表评论时,我并没有意识到 header-only library 的概念。 paxdiablo 的回答为我澄清了一些事情。
猜你喜欢
  • 2013-09-06
  • 1970-01-01
  • 2021-08-20
  • 2015-03-24
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 2014-11-02
  • 2014-01-27
相关资源
最近更新 更多