代码之家  ›  专栏  ›  技术社区  ›  MasterJEET

相当于C++11旧版本的无序\u映射[已关闭]

  •  -4
  • MasterJEET  · 技术社区  · 6 年前

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


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

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   paxdiablo    6 年前

    如果编译器 给你一个价值 1 对于 __cplusplus 编译C++代码时,它是不一致的 (a) .

    在为C++11之前的编译器实现无序映射方面,您可能需要研究Boost—标准C++中的一大块内容首先出现在这里:-) un-ordered map 最早于2008年推出Boost 1.36,因此至少对于符合C++03的编译器来说应该是可以的。

    此外,尽管 部分 在Boost需要构建到库中时,未排序的地图不在其中。作为一个 header-only feature ,只需在代码中包含头文件并使用它即可。例如,以下程序打印 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 one正常工作,我更希望它只基于已知的代码质量。


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

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

    每次迭代的值应为:

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

    可能的 不符合要求的原因是您使用的是4.7之前版本的 g++ -有一个十年前的bug报告 __cplusplus公司 版本为 1. 而不是“适当”的值。

        2
  •  0
  •   besc    6 年前

    您似乎正在使用一个旧的/古怪的/不合规范的编译器和/或标准库。这个 __cplusplus 宏应定义为表示 YYYYMM 指示支持的C++标准的日期。

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

    • std::tr1::unordered_map :C++11版本的前身(如果std库支持)。
    • Boost.Unordered 提供 boost::unordered_map 这只需要一个C++98编译器,并模仿现代 std::无序的\u映射 尽可能接近。