2016-12-29 4 views
1

Ich versuche, wiederholte Wörter mit einer Karte zu zählen, wenn der Benutzer die Zeichenfolge eingibt, sobald die Ausgabe "OK" ist, sonst wird die Ausgabe die Zeichenfolge und die Nummer der Wiederholungszeit der String danebenVerwenden von Maps zum Zählen von Strings Eingabe

ich weiß, dass der Code sehr dumm aussieht, es ist mein erstes Mal Karten mit und ich bin nicht vertraut mit der Syntax

jede mögliche Hilfe geschätzt wird

int main() 
{ 
    int t, i = 0; 
    string s; 
    map<string, int> m; 
    cin >> t; 
    while (t--) { 
     cin >> s; 
     m[s] = i++; 
     if (i == 0) 
      cout << "OK"; 
     else 
      cout << m[s] << m.second << endl; 
    } 
} 
+3

Also genau das, was ist das Problem? – Mureinik

+0

Sei vorsichtig, du erhöhst 'i' in jeder Iteration deiner While-Schleife. So wird jeder String, den Sie nach dem ersten eingeben, als doppelt betrachtet (vorausgesetzt, dass t '1 ist). –

Antwort

3
cin >> s; 
    m[s]++; 
    if (m[s] == 1) 
     cout << "OK\n"; 
    else 
     cout << "this is the " << m[s] << "th occurence of " << s << "\n"; 

Beachten Sie, dass Sie m[s] verwenden können, auch wenn s noch nicht in der Karte enthalten ist, weil der Operator [] es automatisch hinzufügen und seine Sekunde auf Null initialisieren wird.

EDIT: die Suche in der Karte zweimal zu vermeiden (siehe Kommentar von @Slava), wir können auf diese Weise besser (schneller):

cin >> s; 
    i = ++m[s]; 
    if (i == 1) 
     cout << "OK\n"; 
    else 
     cout << "this is the " << i << "th occurence of " << s << "\n"; 
+0

Obwohl dieser Code funktionieren würde, verbirgt er die Tatsache, dass es unnötig ist, teure Operationen zweimal oder sogar dreimal durchzuführen. – Slava

+0

@Slava wahr, eine zweite Version hinzugefügt, um die Suche nur einmal durchzuführen. –

+0

Danke, das war sehr hilfreich – Codingeek

Verwandte Themen