C ++ <map> vs <unordered_map> vs <tr1 unordered_map =“”> vs <ext unordered_map =“”> </ext> </tr1> </unordered_map> </map>

时间:2010-12-22 16:34:55

标签: c++ c++11 tr1 unordered-map

我正在寻找一个更好的替代std :: map并且遇到了帖子标题中提到的类。有人可以澄清它们之间的差异,不是在性能/ API方面,而是在它们与当前和未来标准相关的位置方面。

3 个答案:

答案 0 :(得分:10)

  • std :: map:当前C ++标准关联容器(键/值),作为后面的树;
  • std :: unordered_map:下一个标准(C ++ 0x - 或技术报告1中)哈希映射容器,用作...哈希映射。
  • std :: tr1 :: unordered_map:与前一个名称相同,但在tr1名称空间中,经常出现在希望提供TR1扩展但在另一个名称空间而不是std的编译器中。
  • ext :: unordered_map:仍然是相同的想法,但编译器特定的实现,所以它不能保证与接口和实现上的std :: unordered_map完全相同。

如果可以,请使用std :: unordered_map,因为它是哈希映射实现的最终名称(如果需要哈希映射)。其他名称是存在的,以防您的编译器提供它们但在一个单独的命名空间(因为C ++ 0x尚未正式提供)。

顺便提一下,还有boost :: unordered_map,但它几乎都是相同的想法和界面。

答案 1 :(得分:1)

<tr1/*>中的标题是TR1'草稿'中指定的内容。我相信很多这些可能会进入C ++ 0x(虽然这不能保证,并且存在不兼容的更改的余地)。根据我的理解,<ext/*>是非标准的(即特定于供应商的)扩展。 Boost还提供unordered_map,如果您尝试定位不提供您提到的标题的编译器,这可能很方便。

答案 2 :(得分:0)

如果您正在谈论ext / unordered_map,那么这是旧的SGI / HP STL组件。它与其他unordered_maps非常相似。我会使用std :: unordered_map作为标准组件 - 这就是未来。

据我所知,由于某些原因,旧的SGI / HP哈希容器几乎不会被包含在C ++ 98标准中。