6

私は MS VC 2008 を使用しており、一部のプロジェクトでは Intel 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 に残らず、構成マクロが消えることをユーザーに明確にするために、提案に 2 つの注記が追加されました。

ただし、現在 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++ Librariesにかなり前から存在しています。非常に多くの ISO C++ 1998 コンパイラで動作し、C++0x コンパイラでも (おそらくコンパイラの組み込み実装を使用して) 動作し続けるため、Boost (つまりboost::unordered_map ) を使用することを強くお勧めします。さらに、承認された std::tr1 のアイテムは std に移動されますが、名前空間を変更する必要はありません。boost:: で常に利用できるため、心配する必要はありません。 tr1 のどの要素が標準になっているのか。要するに、ブーストは行く方法です。

于 2010-03-08T17:12:40.447 に答える
1

tr1::unordered_mapハッシュマップにはさまざまな実装が可能であり、標準によって選択された実装は非常に古典的であることに注意してください...ただし、特定のタスクに対して最もパフォーマンスが高いとは限りません.

残念ながら、標準では複数の戦略を実装する必要はありませんでした (かなりの作業が必要だったと思いますが)。

于 2010-03-08T13:16:23.237 に答える