【发布时间】: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。还是两者都一样?
【问题讨论】:
标签: c++ c++11 g++ unordered-map
我正在使用unordered_map,其中包括:
#include <unordered_map>
程序编译如下:
g++ Test.cc -std=gnu++0x -o test
我使用的是 TR1 的 unordered_map 还是 C++0x 的 unordered_map。还是两者都一样?
【问题讨论】:
标签: c++ c++11 g++ unordered-map
我相信 gcc 将他们的 TR1 标头放在 <tr1/unordered_map> 中,所以你应该得到 C++11 版本。但它们非常相似。
【讨论】:
GCC 在 tr1 子目录中有 tr1 头文件。另外还有 tr1 命名空间。
#include <tr1/unordered_map>
...
std::tr1::unordered_map<...>(...);
因此,除非您专门做了这些事情或做了类似的“使用”,否则您已经得到了标准。
实现是分开的,但它们非常相似。有足够的差异(initializer_list、比较操作)使得维护一个包含所有条件和宏的文件变得很痛苦。
【讨论】:
这在很大程度上取决于特定的编译器版本。例如,GCC 4.4 基本上只是为您的-std=c++0x 选项提供了一些宏开关来适当地进行命名空间标签,但最终总是会从tr1_impl/unordered_map 中提取实际代码,而 GCC 4.6 有两个完全独立的实现,一个在 @ 987654323@ 和bits/unordered_map.h 中的一个——以及.../hashtable.h 中各自的基类实现实际上是不同的; C++0x 版本到处都有std::forwards 等等。
简短回答:视情况而定。
【讨论】: