是否值得在生产中使用std :: tr1?

时间:2010-03-08 12:30:28

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

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

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

5 个答案:

答案 0 :(得分:9)

  

是的,tr1中的所有内容都会   留在这。有些事情会发生   在std ::接受,但他们会留下来   在tr1也。所以没有你的代码   一旦新标准出现就会破裂   结束。

原谅我:不,他们不会。如上所述here

  

该提案中添加了两个注释,以便向用户表明,在从TR转换到未来标准时,TR组件将不会保留在命名空间std :: tr1中,配置宏将消失。

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

答案 1 :(得分:6)

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

namespace cpp0x = std::tr1;

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

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

namespace cpp0x = std;

你可以让其他人独自一人。

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

对于tr1::unordered_map,请注意可能存在许多Hash Maps的各种实现,并且标准选择的实现非常经典......但可能不是最适合您的特定任务的。

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

相关问题