旧版本 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
的界面。
对于旧版本的 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 value201103L
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
的界面。