我正在使用 MS VC 2008 和一些项目英特尔 C++ 编译器 11.0。是否值得在生产中使用 tr1 功能?他们会保持新的标准吗?
例如,现在我使用stdext::hash_map
. TR1 定义std::tr1::unordered_map
. 但是在 MS 中实现unordered_map
只是他们的stdext::hash_map
,以另一种方式模板化。
我正在使用 MS VC 2008 和一些项目英特尔 C++ 编译器 11.0。是否值得在生产中使用 tr1 功能?他们会保持新的标准吗?
例如,现在我使用stdext::hash_map
. TR1 定义std::tr1::unordered_map
. 但是在 MS 中实现unordered_map
只是他们的stdext::hash_map
,以另一种方式模板化。
是的,tr1 中的所有内容都将保留在那里。有些东西会在 std:: 中被接受,但它们也会留在 tr1 中。因此,一旦新标准完成,您的任何代码都不会中断。
原谅我:不,他们不会。如此处所述:
提案中添加了两个注释,以向用户明确说明,在从 TR 过渡到未来标准的过程中,TR 组件将不会保留在命名空间 std::tr1 中,并且配置宏将消失。
但值得注意的是,现在愿意支持 tr1 的编译器供应商,很可能不会把地球从你脚下拖走,而是为你提供某种过渡方法。
我的建议是为包含您使用的 TR1 项目的命名空间使用别名。这样,当您的编译器支持它时,您将能够从使用 TR1 版本“迁移”到标准版本。
namespace cpp0x = std::tr1;
cpp0x::unordered_map<std::string, int> mymap;
对于 C++0x 编译器,第一行变为:
namespace cpp0x = std;
你可以不理会其余的。
unordered_map
将在新标准中,hash_map
不会。请注意,tr1
命名空间也不是标准的。
绝大多数将在 C++0x 中添加的库代码在Boost C++ 库中已经存在了很长一段时间。我强烈建议使用 Boost(即boost::unordered_map),因为它适用于大量 ISO C++ 1998 编译器,并且将继续在 C++0x 编译器上工作(可能使用编译器的内置实现)。此外,您不需要更改命名空间——而 std::tr1 中被批准的项目将被移动到 std——因为它始终在 boost:: 中可用,您不必担心关于 tr1 的哪些元素已成为标准。简而言之,Boost 是要走的路。
请tr1::unordered_map
注意,哈希映射可能有许多不同的实现,并且标准选择的实现非常经典......但对于您的特定任务可能不是最有效的。
不幸的是,该标准并不要求实施多种策略(尽管我认为这需要大量的工作)。