Zählen die Anzahl der gleichen Werte in der Karte
ist dort jeder Befehl zählt die Anzahl der gleichen Werte in einer Karte?
wie:
map<int, string> m;
m[1] = "A";
m[22] = "A";
m[53] = "C";
m[12] = "A";
m[6] = "A";
int count = m.count("A");//4
oder sollte ich einfach nur schreiben es selbst, da es nicht zu hart?
- Die erste Sache, die den Sinn kam, war zu erstellen, ein weiteres
std::map<string , int>
welches verwendet wird zum zählen der Häufigkeit der einzelnen.second
- Das sollte das Letzte, was mir einfällt. Du bist einfach Einführung viel Komplexität zu erreichen, eine sehr einfache Aufgabe, für die es bereits toos.
- Dibling: Was meinst du mit viel Komplexität? Wenn Sie sehen, von den Antworten unten, ohne C++0x unterstützen, müssen Sie eine angemessene Menge an code zu schreiben, wenn Sie die Nutzung von STL-count_if. Ich bin geneigt zu glauben, dass mit einer anderen Karte benötigen weniger Menge an code. Auch mit Karte hat eine bessere Laufzeit-Komplexität also O(log n), während Sie gehen durch alle map-Elemente, wenn Sie count_if d.h. O(n)
- Mit einem zweiten
map
zum speichern von Frequenzen ist besser, wenn Sie brauchen, um eine große Anzahl von zählt. Dieser Ansatz erfordert auch, dass die Elemente, die im container gespeichert sind, vergleichbar. Wenn Sie nur eine einzige zählen, dann ist es viel besser, aufzählen der Elemente mitcount_if
. - McNellis: ich sehe Ihren Punkt, und ich denke auch, deine Antwort ist schön und natürlich lehrreich. Aber trotzdem, es ist nicht die Beantwortung meiner Frage zu John Dibling über welche Arten von Komplexität ist die Verwendung einer zweiten Karte imposant, im Vergleich zu mit, um eine Funktion definieren, Objekt =). Ja, es erfordert operator< umgesetzt werden (wahrscheinlich irrelevant, wenn der Schlüssel ist std::string). Ja, es ist Verschwendung von Speicher, wenn man nur zählen, der es mal (auch wenn poster nicht geben). Aber Komplexität in der Umsetzung? Ich nicht kaufen =)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
std::count
mit einem benutzerdefinierten Wert parameter:std::count
oderstd::count_if
wie ein Prädikat. Auch sehe ich nicht ein Weg das Prädikat, dass zwei Argumente: en.cppreference.com/w/cpp/algorithm/countKönnen Sie die
count_if
- Algorithmus mit einer custom-Prädikat-Objekt Funktion:Verwendung:
Oder, für eine allgemeinere Lösung, Sie können schreiben, eine
apply_to_second
Prädikat Transformator:Verwendung:
Wenn Sie einen compiler, unterstützt lambda-Ausdrücke, Sie brauchen keine custom-Prädikat functor bei allen; können Sie eine viel einfachere lambda:
STL ist count_if und es ist durchaus machbar manuell.
EDIT: Sorry, sollte count_if nicht zählen
map::zählen, zählen ist der Schlüssel und nicht das element, so dass das Beispiel in deiner Frage, wäre falsch. Möchten Sie vielleicht zu prüfen, mit eine zusätzliche Karte, um zu verfolgen die Anzahl der einzelnen Werte.
Diese sollte generisch genug:
dann können Sie es verwenden, wie diese:
Tun, beachten Sie, dass dies nicht wirklich sehr Verschieden von vorherigen Antworten, aber es sollte wiederverwendbar sein, mit allem, was durchläuft Paare als auch. Nur umbenennen Bedingung, um etwas sinnvolles.