map lässt sich nicht ausgeben.



  • 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>*>



  • asc schrieb:

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

    Ich finde es ja nett das ihr mir helfen wollt, aber damit eher nicht. Ich studiere jetzt auch schon über 2 Jahre Informatik und weiß schon wie ich vorzugehen habe, wenn ich was nicht verstehe.
    Und beim Programieren brauch ich persönlich immer Beispiele um es zu verstehen von dem her hab ich mir einigige beispiele angeschaut!!!!!!!

    daddy_felix schrieb:

    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.

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

    1. Ich habe keinen Compilerfehler dabei "mymap["d"]-> "(will mymap["d"]->push_back("bbb") machen) schon garnichts kommt und da brauch ich nicht compilieren. Allerdings bei " mymap-> " kommen schon die vorschläge. Also habe ich hier wohl irgendwie ein pointer problem bzw. hab ich hier wahrscheinlich die map mit den pointern nicht verstanden, weil das ist hier für mich ein wenig komplizierter als bei integer.

    2. wenn ich eine refernz habe, kann ich mit der referenz auf der variable ackern.. d.h.

    int var =1;
    int &ref = var;
    
    ref = 2;
    cout << var << endl; // ausgabe 2
    

    genau das mach ich ja jetzt...

    3. was ich aber will ist mit der map

    int i = 1;
    int *pi = 0;
    
    pi = &i; 
    
    cout << *pi << endl;
    
    function1(map<string,vector<string>> *mymap)
    {
    mymap["1"]->pushBack("bla");
    }
    
    void main()
    {
    map<string,vector<string>> amap;
    function1(&amap);
    
    return 0;
    }
    
    //Fehler:
    //error C2107: Ungültiger Index, Dereferenzierung nicht zulässig.
    // Links von "->pushBack" muss sich ein Zeiger auf Klassen-/Struktur-/Union-//generischen Typ befinden.
    


  • lulu32 schrieb:

    1. Ich habe keinen Compilerfehler dabei "mymap["d"]-> "(will mymap["d"]->push_back("bbb") machen) schon garnichts kommt und da brauch ich nicht compilieren. Allerdings bei " mymap-> " kommen schon die vorschläge. Also habe ich hier wohl irgendwie ein pointer problem bzw. hab ich hier wahrscheinlich die map mit den pointern nicht verstanden, weil das ist hier für mich ein wenig komplizierter als bei integer.

    ohje... erstmal solltest du dich nicht blind auf die auto completion verlassen. Soviel, wie du vermutlich zwischen Pointer und Referenz hin- und hergesprungen bist, kommt Visual Assist da auch nicht hinterher.

    Du musst einfach nur den Unterschied in der Verwendung von Pointer und Referenz lernen.

    lulu32 schrieb:

    2. wenn ich eine refernz habe, kann ich mit der referenz auf der variable ackern..

    und wie genau machst du das? Also was ist richtig:

    MyObject& ref = GetReference();
    ref.DoSomething();  // das hier?
    ref->doSomething(); // oder das hier?
    

    [edit]

    // Links von "->pushBack" muss sich ein Zeiger auf Klassen-/Struktur-/Union-//generischen Typ befinden.
    

    da steht es doch. das "Ding", was links von "->pushBack" steht, muss ein Zeiger sein. Das ist es aber bei dir nicht.

    Überleg doch mal, welchen Typ das "Ding" hat, das bei "myMap["1"]" rauskommt...



  • lulu32 schrieb:

    Und beim Programieren brauch ich persönlich immer Beispiele um es zu verstehen von dem her hab ich mir einigige beispiele angeschaut!!!!!!!

    "Jeder soll nach seiner Façon glücklich werden":

    void function1(map<string,vector<string>> *mymap)
    {
      (*mymap)["1"].push_back("bla");           // 1
      mymap->operator[]("1").push_back("bla");  // 2
    }
    


  • Furble Wurble schrieb:

    lulu32 schrieb:

    Und beim Programieren brauch ich persönlich immer Beispiele um es zu verstehen von dem her hab ich mir einigige beispiele angeschaut!!!!!!!

    "Jeder soll nach seiner Façon glücklich werden":

    void function1(map<string,vector<string>> *mymap)
    {
      (*mymap)["1"].push_back("bla");           // 1
      mymap->operator[]("1").push_back("bla");  // 2
    }
    

    Vielen Dank jetzt kann ich auch mal anfangen es zu verstehen 🙂

    Jetzt aber noch zu meiner Verteidigung was, wenn ich einen function(vector<string> *avector) dann kann ich avector->push_back() machen. Das verwirrt mich so..

    Aber dadruch mymap->operator[]("1").push_back("bla"); ist es mir jetzt klar geworden

    vielen dank 🙂


Anmelden zum Antworten