相当于旧版C++的 C++11 unordered_map

Equivalent of C++11 unordered_map for an older version of C++

本文关键字:unordered map C++11 C++ 相当于      更新时间:2023-10-16

对于旧版本的 C++² 来说,相当于 C++11 std::unorderd_map ¹ 是多少?我已经尝试过std::tr1::unordered_map,不幸的是我的编译器不支持它。


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

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

如果您的编译器在编译代码时确实为您提供了1__cplusplus C++则它是不符合 (a( 的。

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

此外,尽管 Boost 的某些部分需要构建到库中,但无序地图不是这些部分之一。作为仅标头功能,您只需在代码中包含标头文件并使用它。例如,下面的程序打印Hello, world.完全没有包含额外的库(我使用了非常基本的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标准:

名称__cplusplus定义为编译C++翻译单元时201103L的值。

每次迭代的值应为:

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

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

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

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

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