STL map elementweise durchlaufen

  • Hallo,

    weis jemand eine Möglichkeit eine STL-map von anfang bis ende durchzugehen?

    Ich stehe nämlich vor folgendem problem:
    Mein Programm liest werte aus einer datei aus & speichert sie in 2 maps -> <string,string> & <string,int>diese maps würde ich gerne auch wieder in einer Datei abspeichern.

    Einfach die Iteratoren durchzulaufen geht ja nicht da der zugriff auf die Elemente über Schlüssel geregelt ist..

    Die einzige Möglichkeit die mir dazu einfällt ist zusätzlich eine list zu verwenden, die die strings (die meine Schlüssel sind) speichert um damit die map für jedes element aufzurufen und abzuspeichern.:shinner:
    [oder die zeichengröße des schlüssels begrenzen und per brute-force alle zeichenkombinationen ausprobieren:p]

    danke im voraus

  • Iteratoren gehen sehr wohl mit maps. Für ein map<Key, T> liefert der Iterator den Elementtyp pair<const Key, T>, du kannst also alle Paare durchlaufen.
    Oder meinst du mit "die Iteratoren durchzulaufen geht ja nicht", daß das für deine Problemstellung nichts bringt? Das könnte sein, dann wäre es allerdings interessant zu wissen, was der Zusammenhang zwischen deinen maps und dem Ausgabefile ist.

    *plantsch*

  • oh danke,:)

    leider kann ich mit deiner erklärung aber nicht viel anfangen,
    bin leider *sehr* neu auf dem gebiet...
    mein problem ist das ich weis wie ich einen Iterator erhöhen kann (um z.b. eine deque <int> zu durchlauffen (iterator++) aber diese Lösung funktioniert IMHO mit strings nicht...
    d.H. Ich bräuchte eine möglichkeit um etwas in dieser art auf meine map(s) anzuwenden:

    Code
    // läuft sicher nicht :-)
    
    
    deque<int> schlange;
    
    
    for (deque<int>::iterator  itor =  schlang.begin(); itor != schlange.end();	 
    	  ++itor ){
    	   schreibeInDatei(*itor);
    }

    Mein Programm ist eine lib (danke für die Hilfe beim erstellen :thumb: )und soll eine Textdatei auslesen und die enthaltenen werte [z.B ' schlüssel = wert ' ] in die map(s) einlesen -> da es möglich istl diese werte auch während der Laufzeit zu ändern möchte ich diese auch wieder abspeichern können.

    danke,
    cheers

  • ich wüsste jetzt grad nicht, was mit der Erklärung von Plantschkuh! zu deiner Fragestellung nicht passt

    maps auslesen wäre zB (musste als ichs brauchte, aber einige Zeit lang googlen):

    Code
    somemap::iterator someIter;
    for (someIter=somemap.begin(); someIter!=somemap.end(); ++someIter) {
      if(someIter->first == "somekey")
         _value = someIter->second;
    }

    bin zwar auch c++-anfänger, aber ich versteh nicht, wieso dein Beispiel nicht mit Strings funktionieren soll ... es wird doch nur die Stelle erhöht, der Inhalt von der Stelle ist irrelevant(?)

    weswegen ich aber poste - hätte auch ne Frage zu den Iteratoren der map:
    Gehe ich mit dem Iterator durch die map und lösche eine Stelle mit "erase", muss ich dann den Iterator an die erste Stelle setzen und von neuem beginnen, weil die map restrukturiert wird oder kann ich normal auf die nächste Stelle weiterwechseln bzw. muss ich den Iterator auf alle Fälle erhöhen, bevor ich die jeweilige Stelle lösche?

  • Ok, danke mit Beispiel habs dann überrissen (mir fehlt das verständnis für "formale" Ausdrucksweise..), aber auf die idee das das so zu verwenden ist, egal bei welchem Datentyp bin ich nicht gekommen...:shinner:

    Zu deiner frage carbon:
    Du brauchst den iterator gar nicht verschieben erase liefert auch keinen zurück, kanns dir nur als Codefragment erklären, hoffe das hilft

  • Danke, dass du versuchst hast, es zu veranschaulichen, aber in deinem Beispiel verwendest du den Iterator nachher nicht mehr.

    Verwende ich den Iterator wie in meinem Beispiel springt er vom 1. Element zum 2., dann zum 3 usw.
    Lösche ich dann, wenn er beim 4. Element angelangt ist, diese Position, springt dann der Iterator danach normal weiter aufs 5. Element?
    Oder zeigt er ins nirgendwo bzw. stattdessen aufs 6. Element, womit der Iterator unbrauchbar geworden ist (weil zB die map sich nach dem Löschvorgang gleich neu strukturiert hat)?

    Wär dann von Interesse, wenn ich alle die nicht einem bestimmten String entsprechen löschen und gleichzeitig die "alte" Position in der map ausgeben will. Restrukturiert sich die map, verlier ich nämlich die richtige, alte Position nach jedem Löschvorgang. Eine eigene Zählvariable für die Position wäre ja auch nur eine Notlösung.
    Reichts, wenn ich den Iterator nicht erhöhe, springt er beim Löschen dann automatisch aufs neue Element?
    Werds vielleicht doch selbst ausprobieren, aber eine richtige Erklärung wär mir doch lieber.

  • habs mit

    Code
    cout<<iter->first<<iter->second;


    direkt nach dem löschen probiert da zeigt er ins nirvana.(absturz)
    Um mit der map weiterzumachen müsstest du also den vorherigen schlüssel speichern.:confused:
    Und dann mit mymap.find(schlüssel) dir wieder einen neuen iterator holen.
    Bei <map> liefert erase() im gegensatz zu <list> keinen iterator zurück.
    edit: du möchtest also die stellen die du gelöscht hast ausgeben (als zahl?)
    da fällt mir allerdings auch nichts besseres ein als die schleifendurchgänge in denen gelöscht wird abzuspeichern..

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!