旧版本 C++ 的 C++11 unordered_map 等价物

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

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


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

² 我正在打印 __cplusplus,它显示 1。我不确定编译器符合哪个 C++ 标准。

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

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

此外,虽然 Boost 的 部分 需要构建到库中,但无序映射不是这些部分之一。作为 header-only feature,您只需在代码中包含头文件并使用它。例如,下面的程序打印 Hello, world. 绝对 no 包含额外的库(我使用 very basic 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 不是 suitable,标准无序映射的属性基本上是所有事物的平均恒定时间复杂度,所以几乎任何半正经的 hash-table 实现也应该是可行的。但是,如果您无法使 Boost one 正常工作,我会选择 - 我更喜欢它,因为它已知的代码质量。


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

The name __cplusplus is defined to the value 201103L when compiling a C++ translation unit.

每次迭代的值应该是:

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

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

您似乎在使用 old/odd/nonconforming 编译器 and/or 标准库。 __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 的界面。