对于旧版本的C ++,相当于C ++ 11 unordered_map

时间:2018-05-01 06:41:35

标签: c++ hashmap unordered-map

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

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

²我正在打印__cplusplus,并说1。我不确定编译器符合哪种C ++标准。

2 个答案:

答案 0 :(得分:0)

如果您的编译器真正 在编译C ++代码时为1提供__cplusplus的值,则它是不符合的(a)

在获取前C ++ 11编译器的无序地图实现方面,你可能想要研究一下Boost - 标准C ++的很大一部分首先出现在: - ){{3早在2008年的Boost 1.36就可以使用了,所以对于至少符合C ++ 03标准的编译器来说应该没问题。

此外,尽管Boost的 parts 需要构建到库中,但是无序映射不是这些部分之一。作为un-ordered map,您只需在代码中包含头文件并使用它即可。例如,以下程序打印Hello, world.,其中包含绝对 no 额外的库(我使用非常基本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 不适合,标准无序地图的属性基本上是所有内容的平均常量时间复杂度,所以几乎任何半有利的散列-table实现也应该可行。但是,如果你无法让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而不是&#34;正确的&#34;值。

答案 1 :(得分:0)

您似乎使用的是旧/奇/不合格的编译器和/或标准库。应将__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的界面。