1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

STL map elementweise durchlaufen

  • insomniac
  • 27. Juli 2005 um 18:33
  • Unerledigt
  • insomniac
    4
    insomniac
    Mitglied
    Punkte
    130
    Beiträge
    19
    • 27. Juli 2005 um 18:33
    • #1

    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

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 27. Juli 2005 um 19:51
    • #2

    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*

  • insomniac
    4
    insomniac
    Mitglied
    Punkte
    130
    Beiträge
    19
    • 28. Juli 2005 um 00:47
    • #3

    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

  • carbon
    7
    carbon
    Mitglied
    Punkte
    530
    Beiträge
    100
    • 28. Juli 2005 um 18:36
    • #4

    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?

  • insomniac
    4
    insomniac
    Mitglied
    Punkte
    130
    Beiträge
    19
    • 28. Juli 2005 um 19:18
    • #5

    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

    Code
    map <string, string> vars;
    map <string, string>::iterator pos;
    
    
    int main(){
      vars['try1'] = "value1";   // Map mit werten füllen
      vars['try2'] = "value2";
      vars['try3'] = "value3";
    
    
      cin<
      if (input == "erase"){
    	 cin>>input;			   // welchen schlüssel?
    	 pos=vars.find(input);
    	 if(pos!= vars.end()){
    	 vars.erase(pos);		// löschen
       }
    }  // danach kann man neue werte einfügen, etc
    Alles anzeigen
  • carbon
    7
    carbon
    Mitglied
    Punkte
    530
    Beiträge
    100
    • 28. Juli 2005 um 21:52
    • #6

    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.

  • insomniac
    4
    insomniac
    Mitglied
    Punkte
    130
    Beiträge
    19
    • 28. Juli 2005 um 22:22
    • #7

    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..

  • carbon
    7
    carbon
    Mitglied
    Punkte
    530
    Beiträge
    100
    • 28. Juli 2005 um 22:32
    • #8

    Aha, gut. Dann muss ichs wohl bei Gelegenheit wirklich mit *.find probieren.

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern