私は現在、std :: mapに代わるより良い方法を探しており、投稿のタイトルに記載されているクラスに出くわしました。誰かが、パフォーマンス/ APIの観点からではなく、現在および今後の標準との関係でそれらがどこにあるのかという観点から、それらの違いを明確にすることができますか?
3 に答える
- std::map : 現在の C++ 標準の連想コンテナー (キー/値) であり、背後にあるツリーとして機能します。
- std::unordered_map : 次の標準 (C++0x -- またはテクニカル レポート 1) のハッシュ マップ コンテナーで、... ハッシュ マップとして機能します。
- std::tr1::unordered_map : 前のものと同じですが、tr1 名前空間にあり、多くの場合、TR1 拡張機能を提供したいコンパイラーで見られますが、std とは別の名前空間にあります。
- ext::unordered_map : 考え方は同じですが、コンパイラ固有の実装であるため、インターフェイスと実装で std::unordered_map とまったく同じであるとは限りません。
可能であれば、std::unordered_map をハッシュ マップ実装の最終的な名前として使用します (ハッシュ マップが必要な場合)。他の名前は、コンパイラがそれらを提供する場合に備えてありますが、別の名前空間にあります (C++0x はまだ正式に利用できないため)。
ちなみにboost::unordered_mapもありますが、考え方もインターフェースもほぼ同じです。
のヘッダーは、 TR1 'ドラフト'<tr1/*>で指定されたものです。これらの多くはC++0xに進む可能性が高いと思います(ただし、これは保証されておらず、互換性のない変更の可能性もあります)。私が理解しているように、は非標準の(つまりベンダー固有の)拡張機能です。Boostはunordered_mapも提供します。これは、言及したヘッダーを提供しないコンパイラーをターゲットにしようとしている場合に便利です。<ext/*>
ext/unordered_map について話している場合、これは古い SGI/HP STL コンポーネントです。これは、他の unordered_maps と非常によく似ています。標準コンポーネントとして std::unordered_map を使用します - それが将来です。
古い SGI/HP ハッシュ コンテナーが、何らかの理由で C++98 標準に含まれていないことはほとんどありませんでした。