Map of arrays erstellen



  • Also im Moment sieht die map so aus : First ist der KnotenIndex
    Seceond enthält( Level,CellIndex,Distance
    und die neuen Koordinaten.

    Ich brauche aber: bevor das first komt das Level als auswahl. also quasi für jedes Level eine eigene Map in der Map.



  • Necrofighter schrieb:

    Ich brauche aber: bevor das first komt das Level als auswahl. also quasi für jedes Level eine eigene Map in der Map.

    Na dann eben:

    std::map<unsigned int, std::map<unsigned int, PtNotEntry> > levelIdToMapOfLevel;
    //          ^levelId     ^map of level ^KnotenIndex
    


  • danke sehr 🙂

    Aber wäre es zum auslesen nicht einfacher dass ganze so zu amchen dass ich in einem Array zu jedem Level die first,second hätte und dann eben über [Level]->first bzw. [Level]-> second das ganze aufrufen könnte.

    Ansonsten müsste ich ja zwei iteratoren als "finder" nutzen um in meiner map klarzukommen, oder?



  • Also wenn ich das jetzt einigermassen richtig verstanden habe, erstellst du für jedes level eine st::map<unsigned int, PtNotEntry> und da du mehrere level im Spiel hast soll eine weitere map all diese maps verwalten. Jede level-map wird also über eine levelId angesprochen?

    Dann könntest du doch beispielsweise beim Laden eines levels dir erstmal die entsprechende levelMap abholen:

    std::map<unsigned int, PtNotEntry>& mapOfLevel = levelIdToMapOfLevel[actualLevel];
    

    und dann mit dieser arbeiten.

    Bin nun erstmal weg - kann also nicht weiter am thread teilnehmen falls weitere Fragen bestehen.
    Gruss.



  • Ähm ich scheitere bei der "multimap" von dir direkt mal am insert :

    Map1.insert(make_pair(cell->getLevel(),????);

    so etwas in der Art müsste es sein, aber bei ??? soll da ein iterator sein der mir auf meinen Key zeigt?



  • Necrofighter schrieb:

    Ähm ich scheitere bei der "multimap" von dir direkt mal am insert :

    Map1.insert(make_pair(cell->getLevel(),????);

    so etwas in der Art müsste es sein, aber bei ??? soll da ein iterator sein der mir auf meinen Key zeigt?

    Meinst Du es so:

    map< unsigned int, map< unsigned int, PtNotEntry > > Map1;
        unsigned int level = 7;
        unsigned knotenIdx = 12;
        PtNotEntry entry;
        Map1[level].insert( make_pair( knotenIdx, entry ) );
    


  • Brauche ich dann überhaupt die Multimap?

    Es ginge doch auch mit:

    map< unsigned int, PtNotEntry > Map1;
    

    oder?



  • Necrofighter schrieb:

    Brauche ich dann überhaupt die Multimap?

    Es ginge doch auch mit:

    map< unsigned int, PtNotEntry > Map1;
    

    oder?

    das ist genau dann ok, wenn es zu jedem Level (Member first) genau einen Eintrag PtNotEntry gibt (Member second). Ich habe Dich so verstanden, dass Du zu einem Level mehrere Objekte des Typs PtNotEntry in die Map stecken möchtest.

    Das ginge auch mit

    std::multimap< unsigned int, PtNotEntry > Map1;
        unsigned int level = 7;
        PtNotEntry entry;
        Map1.insert( make_pair( level, entry ) );
    

    Der Zugriff beim Lesen geschieht dann z.B. mit der Methode find oder lower- und upper_bound bzw. equal_range.

    Gruß
    Werner



  • Nein ich habe zu dverschiedenen Levels gleiche firsts quasi, sodass es über multimaps geht.

    Wie kann ich dann das ganze wieder auslesen?
    Ich habe es nun so versucht, aber der Compieler meckert.

    for(int gg = 0; gg <=reader.getMaxLevel(); ++gg)
    		{for( map< unsigned long, map< unsigned long, PtEntry >>::iterator aa = Map1[gg].begin(); aa != Map1[gg].end(); ++aa;
    		{mapcount4 = ++mapcount4}}
    		cout << "Mapmitarray hat " << mapcount4 <<" Einträge"<< endl;
    


  • so:

    std::map< unsigned long, std::map< unsigned long, PtNotEntry > > Map1;
        for(int gg = 0; gg <=reader.getMaxLevel(); ++gg)
        {
            std::map< unsigned long, PtNotEntry >& map1gg = Map1[gg]; // Referenz, kene Kopie!
            for( std::map< unsigned long, PtNotEntry >::iterator aa = map1gg.begin(); aa != map1gg.end(); ++aa )
            {
                cout << "Mapmitarray hat " << " Einträge"<< endl;
            }
        }
    

    .. lies Dir mal Deine Compiler-Mecker-Meldungen in Ruhe durch und versuche sie zu verstehen.



  • vielen dank

    das

    map< unsigned long, map< unsigned long, PtEntry >>::iterator

    war einfach purer Schachsinn und ein ";" war zuviel 🙂

    Als Anfänger sitzt man wirklich Stunden an so blödem Mist 🙂



  • map<unsigned long, PtEntry>::iterator Indexfind1p1 = projectInTriangleMap[cell->getLevel()].find(cell->getCellNode(i)->getIndex());
    

    damit prüfe ich, ob das was ich suche in der map ist.

    Hier die Abfrage:

    Indexfind1p1 != projectInTriangleMap[cell->getLevel()].end()
    

    da stürzt das programm ab. 😞

    Edit : Fehler gefunden, fragt nicht. *rotwerd*


Anmelden zum Antworten