使用 C++0x 的 unordered_map

Posted

技术标签:

【中文标题】使用 C++0x 的 unordered_map【英文标题】:Using unordered_map of C++0x 【发布时间】:2011-05-10 00:27:45 【问题描述】:

我正在使用unordered_map,其中包括: #include <unordered_map> 程序编译如下: g++ Test.cc -std=gnu++0x -o test 我使用的是 TR1 的 unordered_map 还是 C++0x 的 unordered_map。还是两者都一样?

【问题讨论】:

【参考方案1】:

我相信 gcc 将他们的 TR1 标头放在 <tr1/unordered_map> 中,所以你应该得到 C++11 版本。但它们非常相似。

【讨论】:

我确认 gcc 4.5.2(mingw 端口,如果重要的话)。【参考方案2】:

GCC 在 tr1 子目录中有 tr1 头文件。另外还有 tr1 命名空间。

#include <tr1/unordered_map>
...
std::tr1::unordered_map<...>(...);

因此,除非您专门做了这些事情或做了类似的“使用”,否则您已经得到了标准。

实现是分开的,但它们非常相似。有足够的差异(initializer_list、比较操作)使得维护一个包含所有条件和宏的文件变得很痛苦。

【讨论】:

【参考方案3】:

这在很大程度上取决于特定的编译器版本。例如,GCC 4.4 基本上只是为您的-std=c++0x 选项提供了一些宏开关来适当地进行命名空间标签,但最终总是会从tr1_impl/unordered_map 中提取实际代码,而 GCC 4.6 有两个完全独立的实现,一个在 @ 987654323@ 和bits/unordered_map.h 中的一个——以及.../hashtable.h 中各自的基类实现实际上是不同的; C++0x 版本到处都有std::forwards 等等。

简短回答:视情况而定。

【讨论】:

以上是关于使用 C++0x 的 unordered_map的主要内容,如果未能解决你的问题,请参考以下文章

如何让 C++0x / C++11 风格的基于范围的 for 循环与 clang 一起使用?

使用 C++0x 的 unordered_map

如何使用 for-range 循环切片? C++0x

使用 C++0x 线程库退出时崩溃

是否可以在 C++0x 中使用 auto 执行以下操作?

为啥使用 C printf 格式“%#x”打印 0(零)而没有前导“0x”?