2017-01-16 8 views
1

Ich erstelle eine Karte, um zu vergleichen, ob alle Buchstaben eines Wortes eindeutig sind oder nicht. Wenn ich diese Map erstelle, speichere ich den Wert 1 für das entsprechende Zeichen. Problem ist, wenn ich die Werte der Karte von den Zeichentasten drucke, empfange ich nur Nullen für alle Werte.Wie ändert man den Standard-Integer-Wert in einer Karte?

Bei dem Versuch, dies zu recherchieren, hatte mir jemand gesagt, dass dies aufgrund aller Werte der Karte standardmäßig auf Null gesetzt ist und meine ganze Zahl initialisiert werden muss, damit sie sich ändert. Ich bin nicht ganz klar darüber, was sie mit dem Integer gemeint haben, muss initialisiert werden, weil ich in der Lage sein sollte, einen Literal-Integer-Wert zu übergeben, richtig?

Im Folgenden ist der Code, den ich zur Zeit habe, wie ich Sie in 1 für die Zeichen des Wortes und mein Code überprüft, um zu sehen, passieren bin versucht werden sehen, ob das Zeichen in der Karte ist bereits vorhanden:

#include <iostream> 
    #include <map> 
    using namespace std; 
    bool unique(char const* word) 
     { 
     map<char,int> cmpr; 

     for(int i =0; word[i]!='\0';i++) 
     { 
     if(cmpr[word[i]]) 
     { 
      cout<<"Not all unique"; 
      return false; 
     } 
    else 
     { 
      cmpr.insert(pair<char,int>(word[i],1)); 
     } 
      cout<<cmpr[char(word[i])]; 
    } 
    for(map<char,int>::iterator it = cmpr.begin(); it != cmpr.end();it++) 
    { 

     cout<<it->first<<" and "<<it->second<<endl; 


    } 
    return true; 
} 
int main() 

{ 
    unique("hello"); 
} 

und meine Ausgabeergebnisse in (wenn sie versuchen, ersten und zweiten Wert von Karten Knoten drucken):

e and 0 
    h and 0 
    l and 0 
    o and 0 
+1

Bevorzugen Sie 'std :: string' und nicht Zeichen Array-Zeiger. Ein häufiges Problem bei Zeichenarrays besteht darin, die Zeiger zum Sortieren nicht mit der Zielzeichenfolge zu vergleichen. –

+0

Wenn Sie eine 'map' suchen, verwenden Sie' find' statt '[]'. Der 'find' wird keinen neuen Schlüssel einfügen. –

Antwort

2

Das Problem hier ist, dass

if(cmpr[word[i]]) 

Fügt ein Element in die Map ein, wenn eines nicht existiert, das es hier nicht gibt. Das bedeutet, dass

cmpr.insert(pair<char,int>(word[i],1)); 

Ist ein nichts tun, Betrieb, da der Schlüssel word[i] bereits vorhanden ist.

Was können Sie tun, ist die condtion ändern

if(cmpr.find(word[i]) != cmpr.end()) 

seit find nicht ein Element einfügen oder

cmpr.insert(pair<char,int>(word[i],1)); 

zu

cmpr[word[i]] = 1; 

es zu erhalten ändern

zu arbeiten

Beachten Sie jedoch, dass nichts davon wirklich notwendig ist. Wenn Sie eine std::sting und ein verwenden std::set dann könnte man ganze Funktion als

bool unique(const std::string& word) 
{ 
    return std::set(word.begin(), word.end()).size() == word.size(); 
} 

geschrieben werden Was das tut, ist konstruiert eine set vom string und die set hat die gleiche Mechanik waren es erlaubt nur eindeutige Schlüssel. Dies bedeutet, dass, wenn die Größen nicht gleich sind, mindestens ein wiederholtes Zeichen vorhanden ist.

+0

Oder beheben Sie die Bedingung, um zu überprüfen, ob ein Element existiert, ohne eine einzufügen ('map :: find()' Elementfunktion) –

+0

@BenVoigt Guter Punkt. Aktualisiert. – NathanOliver

+0

@BenVoigt Wow. Ich kann nicht glauben, dass ich das vergessen habe. Danke noch einmal. – NathanOliver

0

können Sie den Standardwert mit einem Zuwachs verwenden:

if (cmpr[word[i]]++ != 0) 
    // value was already present 

Dieser den zusätzlichen Bonus hat (je nachdem, wie man es betrachtet), dass Sie die Anzahl der Vorkommen jedes Zeichens erhalten können, nachdem die Daten hinzugefügt worden.

Verwandte Themen