2014-01-14 15 views
5

In Java haben wir Methoden wie hashCode() und equals(), die von der Karte verwendet werden, um jedes Objekt zu identifizieren. C++ verfügt nicht über solche grundlegenden Methoden, jedes Objekt wird standardmäßig implementiert.Map in C++ als Java-Entwickler verstehen

Wie kann eine Karte jetzt benutzerdefinierte Objekte als Schlüsselwert verwenden?

Edit: Keine doppelte weil sein besonders auf jene Methoden Java-spezifische Schnittstelle Ziel, jemand, der nichts vor mit C getan hat ++

für aussehen würde

Antwort

6

Zuerst wird ein std::map in C++ ist in der Regel ein roter schwarzer Baum, keine Hash-Tabelle. Es gibt auch eine Hash-Karte in C++ 11 mit dem Namen std::unordered_map. Standardmäßig verwendet es operator<, um Elemente zu vergleichen. Sie können auch einen benutzerdefinierten Vergleicher anschließen, der alles vergleichen kann, was Sie wollen. Dies geschieht, indem das optionale dritte Template-Argument std::map verwendet wird.

5

C++ std::map ist eine geordnete Karte, mit Anforderungen, die bedeuten, dass es implementiert als selbstbalancierender binärer Suchbaum (normalerweise rot-schwarz-Baum). Dies bedeutet, dass die Schlüsseltypen eine Art von haben müssen, die in Form eines less-than-Operators oder als benutzerdefinierter Vergleichsfunktor vorliegen kann.

Es gibt viele SO-Posts zur Verwendung eines std::map mit benutzerdefinierten Typen als Schlüssel (siehe one example here).

C++ 11 hat std::unordered_map, die eine Hash-Tabelle mit unterschiedlichen Anforderungen an den Schlüsseltypen ist in C++

2

Karte (genauer gesagt, ist eine Hashfunktion und Gleichheitsvergleich erforderlich) nicht HashMap, sondern eine geordnete Karte (normalerweise als rot-schwarzer Baum implementiert). Einträge werden mit der Komparatorfunktion nach Schlüsseln sortiert. In der Standardimplementierung müssen Schlüssel operator< überlastet sein, Sie können jedoch eine eigene Komparatorfunktion angeben.

Siehe hier für C++ Karte Info: http://en.cppreference.com/w/cpp/container/map

1

Java Hash Karte hat Zeit Komplexität von O (1). In C++ hat die rot-schwarz-baumbasierte Karte eine Zeitkomplexität von O (logN).

CSLM ist hread-safe, concurrent und TreeMap ist nicht. CSLM wurde in JDK 1.6 hinzugefügt

Siehe Dokumente: Java equivalent of C++ std::map?

1

C++ Karte ist eine geordnete Karte, nicht eine Hash-Karte, als Templat ein boolescher Ausdruck comp zu verwenden (a, b) Schlüsselwerten zu vergleichen. Der Standardwert ist less, der den (A < B) Vergleich durchführt, der in C++ durch Klassen überladen werden kann. Alternative Karten können verschiedene Ausdrücke verwenden.

1

std :: map ist eine Vorlagenklasse.Der Schlüssel hat einen bestimmten Begriff strenge schwache Ordnung genannt entsprechen, die garantiert:

  • Keys sind weniger als vergleichbare (Überlastung Operator < oder die Karte einen benutzerdefinierten Komparator geben)
  • Wenn das Element A kleiner als B , B
  • A als nicht kleiner sein kann, wenn das Element A kleiner als B ist und B kleiner als C ist, dann ist A kleiner als C

Hier ist ein Beispiel mit einem benutzerdefinierten Typ als Schlüssel ist:

#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)]; } 

Das gesagt, std :: map ist nicht das genaue Äquivalent von Java-Hash-Karte. C++ 11 hat std::unordered_map dafür. Mit unordered_map können Sie Ihre eigene std :: hash-Vorlage für Ihren eigenen Typ definieren, um Ihren benutzerdefinierten Typ als Hash-Schlüssel beizubehalten.