6

我正在使用 MS VC 2008 和一些项目英特尔 C++ 编译器 11.0。是否值得在生产中使用 tr1 功能?他们会保持新的标准吗?

例如,现在我使用stdext::hash_map. TR1 定义std::tr1::unordered_map. 但是在 MS 中实现unordered_map只是他们的stdext::hash_map,以另一种方式模板化。

4

5 回答 5

9

是的,tr1 中的所有内容都将保留在那里。有些东西会在 std:: 中被接受,但它们也会留在 tr1 中。因此,一旦新标准完成,您的任何代码都不会中断。

原谅我:不,他们不会。如此处所述:

提案中添加了两个注释,以向用户明确说明,在从 TR 过渡到未来标准的过程中,TR 组件将不会保留在命名空间 std::tr1 中,并且配置宏将消失。

但值得注意的是,现在愿意支持 tr1 的编译器供应商,很可能不会把地球从你脚下拖走,而是为你提供某种过渡方法。

于 2010-03-08T12:33:10.620 回答
7

我的建议是为包含您使用的 TR1 项目的命名空间使用别名。这样,当您的编译器支持它时,您将能够从使用 TR1 版本“迁移”到标准版本。

namespace cpp0x = std::tr1;

cpp0x::unordered_map<std::string, int> mymap;

对于 C++0x 编译器,第一行变为:

namespace cpp0x = std;

你可以不理会其余的。

于 2010-03-08T16:54:56.463 回答
5

unordered_map将在新标准中,hash_map不会。请注意,tr1命名空间也不是标准的。

于 2010-03-08T13:18:57.220 回答
2

绝大多数将在 C++0x 中添加的库代码在Boost C++ 库中已经存在了很长一段时间。我强烈建议使用 Boost(即boost::unordered_map),因为它适用于大量 ISO C++ 1998 编译器,并且将继续在 C++0x 编译器上工作(可能使用编译器的内置实现)。此外,您不需要更改命名空间——而 std::tr1 中被批准的项目将被移动到 std——因为它始终在 boost:: 中可用,您不必担心关于 tr1 的哪些元素已成为标准。简而言之,Boost 是要走的路。

于 2010-03-08T17:12:40.447 回答
1

tr1::unordered_map注意,哈希映射可能有许多不同的实现,并且标准选择的实现非常经典......但对于您的特定任务可能不是最有效的。

不幸的是,该标准并不要求实施多种策略(尽管我认为这需要大量的工作)。

于 2010-03-08T13:16:23.237 回答