2016-07-01 4 views
-1

Hier ist die Situation:Wie man eine Karte mit Worten als Schlüssel in C füllen ++

Ich nehme Stachel als Eingabe verwendet diese:

string s; 
getline (cin , s); 

Jetzt möchte ich eine Karte von Typ füllen <string, int> . Der Schlüssel dieser Map sind einzelne Wörter der Eingabezeichenfolge. Der Wert speichert die Häufigkeit des Wortes.

Beispiel: Eingabezeichenfolge - "Hallo mein Name ist OP Hallo Welt"

Karte sollte wie:

Hallo - 2

My - 1

- 1

ist - 1

OP - 1

World - 1

Das Verfahren, das ich weiß, ist unter Verwendung von String manipution Zeichenfolge in ein Array von getrennten Wörter zu unterteilen.

Gibt es eine andere effiziente Möglichkeit, eine Zeichenfolge in ein Array von Wörtern aufzuteilen und die Karte mit einem Wort als Schlüssel zu füllen?

+0

den Eingangs Unter der Annahme Raum begrenzt, gerade gelesen, jedes Wort einen nach dem anderen, und fügen Sie die Karte. Wenn dies nicht das ist, was Sie brauchen, könnten Sie vielleicht Ihre Frage klären. –

+0

* Die Frage, wie Sie es geschrieben haben, ist unklar. * Wenn Sie 'std :: string' als Schlüssel verwenden, was speichert' int'? Wie oft wird dieses Wort angezeigt? Die Reihenfolge, in der das Wort zuerst erscheint? Sie müssen mehr Informationen bereitstellen. – Xirema

+0

Änderungen vorgenommen, wie von allen vorgeschlagen –

Antwort

0
  1. Sie müssen die Eingabezeichenfolge aufgeteilt in Teilzeichenfolge
  2. Finden Sie die Anzahl der Vorkommen jedes Teilstrings in der eingegebenen Zeichenfolge.
  3. Speichern Sie den Teilstring als Schlüssel und zählen Sie als Wert in der Karte.

int main() 
{ 
    std::string input="Hello My name is OP Hello World"; 
    std::map<std::string, int> myMap; 
    std::istringstream iss(input); 
    while (iss) { 
     std::string substr; 
     std::getline(iss,substr,' '); 
     int count = 0; 
     auto pos = input.find(substr, 0); 
     while (pos != std::string::npos) { 
      ++count; 
      pos = input.find(substr, pos + 1); 
     } 
     if(substr.size() != 0) 
      myMap[substr] = count; 
    } 
    for (const auto &p : myMap) { 
     std::cout << p.first << "=" << p.second << '\n'; 
    } 
    return 0; 
} 

Output

Hello=2 
My=1 
OP=1 
World=1 
is=1 
name=1 
+0

Ich habe eine andere Antwort, aber Sie haben auch Recht! –

+0

@SnakeEyes: Ich bin froh, dass ich helfen konnte. – user1336087

-1

So sagten Sie, Sie Ihre Zeichenfolge gespaltet haben, aber Sie möchten also hier einen besseren Weg finden, sind die eleganteste Weg ist für String spliting in C++ Split a string in C++, unter der Annahme, dass Ihre Worte mit Whitespaces getrennt.

Jetzt haben Sie Ihre Worte, Ihre Worte erhalten und alle von ihnen durchlaufen eine Schleife verwenden, und verwenden Sie diesen Befehl innerhalb der Schleife:

WhateverYourMapName[WhateverTheCurrentWordIs]++;

Diese Erklärung wird erhöht den Wert Ihre bestehenden Schlüssel (Wort) von 1.em OR wird es ein neues Schlüssel (Wort) hinzufügen, wenn es nicht gefunden wurde, mit einem anfänglichen Wert von 1.

+0

Was ist das Problem und warum die Daunenwahl? –

-3

Verwenden Sie strtok, um die Leerräume aufzuteilen und die Wörter iterieren zu lassen, überprüfen Sie jedes, wenn das Wort in der Karte von find ist und weisen Sie es der Karte zu oder ändern Sie dessen Wert.

+1

'strtok' ist eine C-Funktion zum Zerstören, dh ich spalte null-terminierte' char'-Arrays. Es war dort sowieso nicht sehr beliebt. Es ist jedoch für C++ mit 'std :: string' völlig irrelevant. Es wird einfach nicht funktionieren. Auch wenn es irgendwie geschah, ist die schiere Geradlinigkeit und oft die Gefahr, mit rohen Strings in C umzugehen, der Grund, warum 'std :: string' in C++ existiert. Diese Antwort ist sowohl technisch als auch in Bezug auf die gute C++ - Philosophie falsch. –

+0

Sie können das verstärken, um nicht zu arbeiten, ohne dass Annahmen über undefiniertes Verhalten gemacht werden. C++ 17 kann dies ändern, um nur mit einer Nicht-'const'-Datenmethode zu arbeiten. – user4581301

-2

Wenn Sie eine Funktion zum Teilen eines std::string Objekt in ein Array von Strings haben auf ein Trennzeichen basiert, dann ist es Ihre Aufgabe ist eigentlich ganz einfach:

std::vector<std::string> lines; 
std::string line; 
while(std::getline(std::cin, line)) lines.emplace_back(line); 
std::map<std::string, int> word_map; 
for(const std::string & line : lines_of_input) { 
    //my_split_method can either be a standard library function, if one exists, or a function you've written yourself 
    std::vector<std::string> words = my_split_method(line); 
    for(const std::string & word : words) { 
     word_map[word]++; 
    } 
} 

for(const auto & word_pair : word_map) { 
    std::cout << "Frequency of \"" << word_pair.first << "\" is " << word_pair.second << std::endl; 
} 
+0

Wenn es ein Problem mit dieser Antwort gibt, dann erkläre es, anstatt einfach nur runterzugehen. – Xirema

+0

Zuallererst bin ich nicht derjenige, der deine Antwort abgelehnt hat. Zweitens ist die Frage, eine Zeichenfolge in eine Reihe von Wörtern zu teilen. –

+0

@SnakeEyes Von Ihrem Beitrag: * "Die Methode, die ich kenne, verwendet String-Manipulation, um String in ein Array von verschiedenen Wörtern zu teilen." * Bedeutet, dass Sie bereits den Algorithmus haben, der Ihnen erlaubt, dies zu tun. Ist das nicht der Fall? – Xirema