map lässt sich nicht ausgeben.



  • hallo,

    ich muss euch heute schon wieder belästigen, ich versuche gerade ne map zu schreiben mit einem vector. ich weiß ich könnte auch eine multimap nehmen aber wurde es gerne so verstehen

    #include <iostream>
    #include <map>
    #include <vector>
    using namespace std;
    
    int main ()
    {
      map<int,vector<string>> mymap;
      map<int,vector<string>>::iterator it;
    
      mymap[1].push_back("bla 1");
      mymap[1].push_back("bla 2");
      mymap[1].push_back("bla 3");
    
      mymap[2].push_back("bla4");
      maymap[2].push_back("bla5");
    
      // show content:
      for ( it=mymap.begin() ; it != mymap.end(); it++ )
        cout << (*it).first << " => " << (*it).second << endl;
    
    }
    

    problem ist jetzt, er meckert beim cout
    Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::vector<_Ty>' akzeptiert (oder keine geeignete Konvertierung möglich)

    ich weiß aber nicht wie ich es anderst machen soll 😞



  • (*it).second

    Das ist ein vector<string>
    Der vector kann sich selber aber nicht ausgeben - er weiss ja nicht wie du es gerne hättest. Genauso wie du über die map itertierst und die einzelnen elemenete ausgibst, musst du das bei dem vector auch machen.


  • Mod

    Wie würdest du denn die Elemente eines vectors ausgeben, wenn er nicht in einer map steckt?

    vector<string> bla;
    bla.push_back("Hallo")
    bla.push_back("Welt");
    
    // Ausgabe:
    // ???
    


  • lulu32 schrieb:

    problem ist jetzt, er meckert beim cout
    Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::vector<_Ty>' akzeptiert (oder keine geeignete Konvertierung möglich)

    ich weiß aber nicht wie ich es anderst machen soll 😞

    Naja, das sollte eigentlich auf der Hand liegen. Du schreibst hier manuell eine Ausgabe für die Map, als Schleife. Vermutlich weil du weißt, dass ein einfaches cout << mymap; nicht funktioniert, weils keinen op << für std::map gibt.

    Das selbe Problem hast du auch beim vector. Die Lösung für das Problem sieht ähnlich aus.



  • SeppJ schrieb:

    Wie würdest du denn die Elemente eines vectors ausgeben, wenn er nicht in einer map steckt?

    vector<string> bla;
    bla.push_back("Hallo")
    bla.push_back("Welt");
    
    // Ausgabe:
    // ???
    

    da würde ich sagen

    cout << bla.[0] << endl;

    hmm aber keine ahnung wie ich des bei ner map machen soll..?
    also ich denke mal eine zweite for schleife mit der anzahl der elemente.

    aber wie ich dann die map ansprechen soll komm ich nicht drauf :(?



  • lulu32 schrieb:

    da würde ich sagen

    cout << bla.[0] << endl;

    Fast. cout << bla[0] << endl; - ohne den Punkt.

    lulu32 schrieb:

    also ich denke mal eine zweite for schleife mit der anzahl der elemente.

    aber wie ich dann die map ansprechen soll komm ich nicht drauf :(?

    Zweite Schleife ist richtig. Die Map musst du nicht mehr ansprechen, die hast du doch schon verwurstet. Dein Problem ist doch, dass (*it).second (was du übrigens auch als it->second schreiben kannst) ein vector ist, der nicht so einfach ausgegeben werden kann.
    Wenn der vector bla heißt, greifst du also z.B. mit bla[0] auf die Elemente zu. Wenn der vector aber nu it->second heißt, wie greifst du dann auf die Elemente zu? 😉



  • lulu32 schrieb:

    da würde ich sagen

    cout << bla.[0] << endl;

    damit gibst du das erste Element aus. Wenn der vector nun 10.000 Elemente hat? Oder noch schlimmer: wenn du gar nciht genau weißt, wieviele Elemente tatsächlich enthalten sind?



  • for ( it1=mymap.begin() ; it1 != mymap.end(); it1++ )
    		{
    			cout << (*it1).first << endl;
    			for( int j = 0; j<(*it1).second.size(); j++)
    			{
    				cout << (*it1).second[j] << endl;
    			}
    		}
    

    also es geht mal so, ob ich das so auch darf?
    ich bin absoluter anfänger mit solchen sachen 🙂

    // edit

    oh man jetzt kommt schon die nächste frage. ich habs immer noch nicht richtig in meinem kopf gespeichert bzw. realisiert.

    wie greife ich dann auf einem bestimmt wert zu und überschreibe ihn?



  • lulu32 schrieb:

    also es geht mal so, ob ich das so auch darf?

    Darfst du 🙂

    ich bin absoluter anfänger mit solchen sachen 🙂

    Ein gutes Buch sollte dir solche Dinge aber schon beibringen...

    wie greife ich dann auf einem bestimmt wert zu und überschreibe ihn?

    Bei einer normalen Variable geht das so: x = 5; Bei einem vector-Element gehts so: bla[2] = 42; - der Zugriff sieht schreibend nicht anders aus als lesend. Wie das jetzt bei den mymap-Iteratoren und den firsts und seconds dahinter aussieht, darfst du einmal raten 😉



  • danke für die antwort, ich habs hinbekommen aber jetzt hört es schon wieder auf, ich komm ständig an grenzen

    mymap.find("2")->second[1] = "geaendert"; 
     cout << "\n" << mymap.find("2")->second[1] << endl;// hat geklappt jaaaaa :)
    
      // hätte ich gern das es geht aber tut nicht :(
      for(int j = 0; j<(*it1).second.size(); j++) // (*it1) ist natürlich -827223 somit fehler. 
      {	  
    	 if(strcmp(mymap.find("2")->second[j],"geaendert") == 0) // strcmp will irgendwas anderes... da ist auch noch der wurm drinn
    	 mymap.find("2")->second[j] = "nochmal geaendert";
      }
    

    Fehler:
    error C2664: 'strcmp': Konvertierung des Parameters 1 von 'std::basic_string<_Elem,_Traits,_Ax>' in 'const char *' nicht möglich

    wenn das jetzt noch irgendwie gehen würde, dann wäre ich glücklich 🙂

    // Kommando zurück, ich sehe den wald vor lauter bäumen nimmer, ich brauch nen kaffee 🙂

    so gehts jetzt 🙂 🙂

    for(int p = 0; p<mymap.find("2")->second.size(); p++)
      {	  
    	 if(mymap.find("2")->second[p] == "geaendert")
    	       mymap.find("2")->second[p] = "nochmal geaendert";
      }
    

  • Mod

    Warum benutzt du strcmp mit std::string? Jemand der dir irgendetwas aus cstring/string.h für die Benutzung in C++ nennt, hat zu 99% keine Ahnung.

    Noch ein wichtiger Tipp: Speicher dir das Ergebnis von find zwischen! find ist eine teure Funktion, die geht mit O(log(Mapgröße)) und hat große Konstanten.



  • so jetzt hab ich was, was ich zwar durch probieren rausgefunden habe, aber ich es nicht verstehe...

    beim vector ist es klar, den übergebe ich als reference weil er nen pointer erwartet.

    bei der map ging das nicht, hier muss ich ne refernce setzen und die map ganz normal einfügen.. es funktioniert aber ich verstehe nicht warum das bei der map jetzt anderst ist als beim vector

    vector<string> dervektor;
    int i;
    i=0;
    map<string,vector<string>> mymap;
    
    checkContentOfDir(pfad, &dervektor, &i, mymap);
    
    // funktionsdeklaration:
    
    checkContentOfDir(string strInPath, vector<string> *list, int *zaehler, map<string,vector<string>> &mymap ) // warum & und nicht *??
    {
    mymap["1"].push_back("bla");
    
    ++*zaehler;
    list->push_back("listbla");
    .
    .
    .
    }
    

    // PS: ich habe KEINE Ahnung, ich programiere seit 6 Wochen effektiv, davor nur 2 Semster in der FH und da hab ich nicht wirklich viel programiert.



  • du kannst sowohl einen vector als auch eine map als Pointer oder als Referenz übergeben.

    Wenn da was nicht geht, machst du was falsch.



  • das geht aber nicht:

    // main.cpp
    map<string,vector<string>> mymap;
    
    funktion(&mymap);
    
    // funktionsdeklaration
    
    void funktion(*mymap)
    {
      mymap["1"]->push_back("bla"); //es geht nicht!!
    }
    


  • lulu32 schrieb:

    das geht aber nicht:

    // main.cpp
    map<string,vector<string>> mymap;
    
    funktion(&mymap);
    
    // funktionsdeklaration
    
    void funktion(*mymap)
    {
      mymap["1"]->push_back("bla"); //es geht nicht!!
    }
    

    das wird aber auch mit einem vector nicht funktionieren. Schau dir doch nochmal an, wie eine Funktionssignatur auszusehen hat.



  • hmm tut mir leid ich verstehe nur noch bahnhof, entweder ich mach irgendwo nen dicken fehler oder ich schalt komplett aus:

    // das hier ist meine funktion
    void checkContentOfDir(string strInPath, vector<string> *list, int *zaehler, map<string,vector<string>> &mymap ) // ACHTUNG mymap hat & und nicht *
    	{
    list->push_back("bla"); // funktioniert einwandfrei
    mymap["ddf"].push_back("bla"); // funktioniert auch
    
    // aber warum geht es nicht das ich oben *mymap machen und dann
     mymap["ddf"]->push_back("bla"); // das geht einfach nicht
    }
    
    // in der main sieht es so aus:
    
            int i;
    	i=0;
    
    	vector<string> dervektor;
    	map<string,vector<string>> mymap;
             string pfad;
    	pfad = "C:\\Program Files\\GIMP 2\\";
    
    checkContentOfDir(pfad, &dervektor, &i, mymap); // auch hier &mymap geht nicht.... er will mymap
    

    // edit

    also wenn ich es so mache wie beim vektor dann kann ich nur

    // z.b. das hie rmachen
    mymap->find();
    
    ich weiß aber nicht wie ich den dann befüllen soll...
    


  • Mir ist zwar nicht klar warum du hier überhaupt mit Zeigern arbeitest, aber dir fehlt wohl ein großes Verständnis wie Operatoren arbeiten. std::map hat die Methode "operator[]", aber nicht ein Zeiger auf eine map (Ein Zeiger hat keine Methoden).

    // Wenn mymap nun als Zeiger übergeben wurde:
    (*mymap)["ddf"].push_back("bla");
    


  • wo hab ich denn ein problem mit zeigern?

    ich erstelle im hauptprogramm eine variable und will mit der funktion auf dieser variable ackern. also erstelle ich doch eine funktion die einen pointer will...

    so jetzt:

    // funktion 1
    void function1(vector<string> *list)
    {
       list->push_back("blabla");
    }
    
    //main
    int main()
    {
    vector<string> *alist;
    
    function1(&alist);
    cout << alist[1] << endl; // gibt blabla aus!
    
    return 0;
    }
    

    Bis hier hin habe ich doch richtig gearbeitet? Oder etas nicht?

    So jetzt gehts zur map

    // funkion 2 mit map
    
    function2(map<string,vector<string>> *mymap)
    {
    mymap["1"]->push_back("blabla"); // geht nicht
    mymap->find("xy");                      // geht schon, ich weiß also nicht wie ich den ganzen käse befüllen soll, hier liegt der wurm wahrscheinlich weil es bei ner map durch mymap["1"] eben durch das erste element wohl anderst wird?
    }
    
    //main
    int main()
    {
    map<string,vector<string>> amap;
    
    function2(&amap);
    
    return 0;
    }
    

    Ich habe es jetzt so gemacht, das müsste doch auch sauber programmiert sein?

    // funktion 3 mit referenz
    void function3(map<string,vector<string>> &mymap)
    {
       mymap["1"]->push_back("blaba");
    }
    
    // main
    int main()
    {
    map<string,vector<string>> amap;
    
    function2(&amap);
    return 0;
    }
    

    Ich hab mir schon x-mal pointer angesehen und hab es eigentlich auch verstandne, nur verstehe ich hier das problem nicht, warum es nicht geht.



  • Wäre schön wenn du dir wenigstens mein Beispiel angeschaut hättest. Dann würdest du vielleicht auch verstehen...



  • lulu32 schrieb:

    Ich habe es jetzt so gemacht, das müsste doch auch sauber programmiert sein?

    Zeig doch mal die Fehlermeldungen, die der Compiler dazu ausgibt. Da sollte eigentlich drinstehen, wo die Fehler liegen.

    lulu32 schrieb:

    Ich hab mir schon x-mal pointer angesehen und hab es eigentlich auch verstandne, nur verstehe ich hier das problem nicht, warum es nicht geht.

    1. Weißt du, was eine Referenz ist? Und weißt du, wie man ein Objekt "als Referenz" übergibt?

    2. Du hast eine std::map<string, vector<string>> und keine std::map<string, vector<string>*>


Anmelden zum Antworten