对于旧版本的C ++²,C ++ 11 std::unorderd_map
¹的等价物是什么?我试过std::tr1::unordered_map
,不幸的是我的编译器不支持它。
¹我真的需要unordered_map
的好处,即平均 O(1)时间访问。
²我正在打印__cplusplus
,并说1
。我不确定编译器符合哪种C ++标准。
答案 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_map
只需要一个C ++ 98编译器,并尽可能地模仿现代std::unordered_map
的界面。