2014-01-14 10 views
5

Javaでは、マップによって各オブジェクトを識別するために使用されるhashCode()およびequals()などのメソッドがあります。 C++にはそのような基本的なメソッドはありません。各オブジェクトはデフォルトで実装されています。Java開発者としてのC++でのマップの理解

マップで、カスタムオブジェクトをキー値として使用する方法を教えてください。

編集:いいえ重複it'sは特に、Java固有のインタフェースメソッドに向けて目指しているので、何もC++で以前に行われなかった人は

答えて

6

まず、C++でのstd::mapは、一般的に、赤、黒の木ではなく、ハッシュテーブルです。 std::unordered_mapと呼ばれるC++ 11のハッシュマップもあります。デフォルトでは、要素を比較するのにoperator<が使用されます。また、カスタムコンパレータをプラグインして、必要なものを使って比較することもできます。これは、オプションの第3テンプレート引数std::mapを使用して行います。

5

C++ std::mapのためになり、それがあることを意味要件に、注文したマップであり、自己平衡バイナリ検索ツリー(通常は赤黒のツリー)として実装されています。これは、キータイプがstrict weak orderingの何らかの種類を持たなければならないことを意味します。これは、less-than演算子の形で、またはユーザー定義の比較ファンクタとして提供されます。

std::mapをユーザ定義タイプとともにキー(one example hereを参照)として使用する方法については、多くの投稿があります。

C++ 11 C++で

2

地図HashMapのではなく、順序付けられたマップ(具体的には、ハッシュ関数と等価の比較が必要とされる)キータイプの異なる要件を持つハッシュテーブルである、std::unordered_mapを有します(通常は赤黒の木として実装されています)。エントリは、コンパレータ機能を使用してキーによってソートされます。既定の実装では、キーにはoperator<がオーバーロードされている必要がありますが、独自のコンパレータ関数を指定できます。

は、C++の地図情報についてはこちらをご覧ください:http://en.cppreference.com/w/cpp/container/map

1

JavaのハッシュマップはO(1)の時間複雑さを持っています。 C++では、赤黒の木ベースのマップはO(logN)の時間複雑さを持っています。

CSLMがhread-safe,concurrentおよびTreeMapではない。 CSLMは、参照ドキュメント

JDK 1.6で添加した:Java equivalent of C++ std::map?

1

C++マップは、順序付けられたマップではなく、ブール式COMPを(a、b)は、キー値を比較するために使用するテンプレートのハッシュマップです。デフォルトはless(A < B)の比較を実行するもので、C++ではクラスによってオーバーロードされます。代替マップは異なる式を使用できます。

1

std :: mapはテンプレートベースのクラスです。キーは、特定の概念と一致しなければならない保証厳密弱い順序付けと呼ばれる:要素AがB未満である場合

  • キーはより少なくより匹敵する(過負荷オペレータ<またはマップをカスタムコンパレータを与える)
  • あります

    :要素AがB未満であり、BがC未満である場合、Bは、
  • 未満であることができない場合、Aは、C

未満ここキーなどのカスタムタイプの例ですされます

#include <map> 
#include <iostream> 
struct Custom{ Custom(int c): c(c){} int c; }; 
bool operator< (Custom const &a, Custom const &b){ return a.c< b.c; } 
int main(){ std::map<Custom, int> m; m[Custom(42)]= 42; std::cout<< m[Custom(42)]; } 

つまり、std :: mapはJavaのハッシュマップとまったく同じではありません。 C++ 11にはstd::unordered_mapがあります。 unordered_mapを使用すると、独自のタイプの独自のstd :: hashテンプレートを定義して、カスタムタイプをハッシュキーとして保持できます。

関連する問題