ist es sowas map<std:string, void*> myMap; möglich?



  • hi Experten, ich habe eine .txt datei, die so aufgebaut ist:
    1 wertuzzui
    2 fdsggjjjkk
    3 dhhjjkolp
    usw. insgesamt 2 Mio Einträge
    Jetzt die Aufgabe: ich muss nach der Eingabe von 2 den String:fdsggjjjkk kriegen, anders gesagt ich muss in dieser Datei suchen und Ergebnis ausgeben, und das in kürzester Zeit.
    meine bisherige lösung sieht so aus:
    [code]
    myFile.open("abc.txt");

    if(myFile.is_open())
    {
    std::string answ;
    std::string buf;
    for(int i=0; i<2000000; i++)
    {
    myFile >>key;
    myFile >>code;
    myMap.insert(std::make_pair(std::string(key), std::string(code)));
    }

    do
    {
    cin>>key;

    if(it == myMap.end())
    {
    cout<<"not found"<<endl;
    }
    else
    {
    cout<<(it->second)<<endl;
    }

    cin>>answ;
    }while( answ == "j" );
    }
    else
    {
    cout<<"Can't open file"<<endl;
    exit(1);
    }
    myFile.close();

    Ich lese die ganze Datei in map aus und dann suche dort,
    aber habe gehört es könnte man auch anders machen und zwar nicht den ganzen inhalt in map auslesen, sondern nur 1. string und die Adresse auf diesen String in map speichern, dann in map nach passendem String suchen und mir der Adresse in die .txt datei an die best. Stelle reinspringen und 2 String ausgeben. gibt es so was: map<string, void*> myMap;?



  • Du kannst dort einen beliebigen Datentyp als Werte in die Map eintragen - allerdings müsstest du bei einer void*-Map selber den Speicherplatz verwalten. (und da ist mir eine string-Map doch lieber)

    PS: Ich weiß nicht, ob es Absicht ist, aber in deinem Code fehlt der Suchen-Befehl 😉

    PPS: Wenn du alle Schlüsselwerte von 1 bis 2 Millionen hintereinander hast, empfehle ich eher einen vector<string> als deine Map.



  • teste lieber auf End Of File, anstatt dich auf 2 Mio festzulegen. Und wenn du nur diesen Einganstrig suchst, dann teste doch sofort in Der Ausleschleife, anstatt die gesamte Datei in den Speicher zu laden.



  • aber ich muss getrennt auf 1 oder 2 string in einer Zeile greifen können,

    den suchbefehl habe ich aus versehen beim kopieren gelöscht es ist natürlich:
    std::map<std::string, std::string>::iterator it = myMap.find(key);

    wg.längeren Lesezeiten muss es lieber map mit zeiger auf die Speicheradresse sein. könnte mir da jemand ein Beispielcode zeigen?


Anmelden zum Antworten