2016-05-13 11 views
-4

Ich deklariere eine Hash-Map wie map<char *, int> m in meinem C++ - Programm. Aber es funktionierte nicht, also befolgte ich die Anweisungen von Using char* as a key in std::map und erklärte meine Karte wie map<char *, int, cmp_str> m. Mein Programm Art sieht aus wie dieseChar * als Schlüssel in einer Karte C++

struct cmp_str 
{ 
    bool operator()(char const *a, char const *b) 
    { 
     return std::strcmp(a, b) < 0; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    map<char *, int, cmp_str> m 
    //Reading strings from a file 
    while(not end of file) 
    { 
    // char *str contains the line 
    if(m.find(str) != m.end()) {m[str]++; } 
    else {m[str] = 1;} 

    } 
} 

Wenn ich das Programm ausführen, wenn alle Saiten findet aber zunächst auch wenn sie nicht eingesetzt werden. Als ich versuchte, map<string, int> m; zu verwenden und char *str in std::string umwandelte, funktioniert es gut. Aber die Eingabedatei ist so groß, dass ich viel Zeit brauche, wenn ich String benutze. Ich bin mir nicht sicher, warum es alle Zeichenfolgen findet, wenn ich char * verwende. Jede Hilfe wäre willkommen.

+0

Also, was ist deine Frage? –

+5

Eigentlich ist ['std :: map'] (http://en.cppreference.com/w/cpp/container/map) keine * Hash * Map, sondern ein Binärbaum. Wenn Sie einen Hash wünschen, sollten Sie ['std :: unordered_map'] (http://en.cppreference.com/w/cpp/container/unordered_map) verwenden. –

+7

Veröffentlichen Sie einen [MCVE] (http://stackoverflow.com/help/mcve). Der von Ihnen gepostete Code ist nicht * vollständig *. –

Antwort

3

Wenn Sie map<char *, int, cmp_str> m verwenden, können Sie diesen Puffer nicht ändern, nachdem Sie ihn in std::map eingefügt haben, da die Karte keine Daten, sondern den Zeiger selbst kopiert. Wenn Sie std::map<std::string,int> verwenden std::string macht eine Kopie und deshalb funktioniert es und es ist langsamer. Also müssen Sie entweder manuell viele Puffer erstellen und Zeichenfolgen darin speichern (und es wird Ihr Programm langsamer machen) oder std::string verwenden, was richtiger und besser ist.

+0

Das ist wahr. Meine Saiten haben eine feste Länge von 50. Gibt es einen schnelleren Weg dies zu tun? –

+0

@CPP_NEW vielleicht ja, aber Sie müssen erklären, was Sie erreichen wollen. Beachten Sie, wenn Sie sich dazu entscheiden, eine neue Frage zu öffnen. – Slava

+0

Ich habe eine große Datei (~ 5GB) und ich möchte die Anzahl jeder Zeile in einer Hash-Tabelle speichern. Momentan dauert es ca. 10 Minuten, wenn ich 'std :: string' verwende. Ich will es schneller –

Verwandte Themen