我正在使用MS VC 2008和一些项目英特尔C ++编译器11.0。是否值得在生产中使用tr1功能?他们会保持新的标准吗?
例如,现在我使用stdext::hash_map
。 TR1定义std::tr1::unordered_map
。但在MS实施中,unordered_map
只是他们的stdext::hash_map
,以另一种方式进行模板化。
答案 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的各种实现,并且标准选择的实现非常经典......但可能不是最适合您的特定任务的。
不幸的是,标准并没有要求实施多种策略(尽管我认为这需要相当多的工作)。