In einer Map Zeiger oder ähnliches speichern.



  • So Leute mal wieder ich und mal wieder habe ich ein Problem mit maps und Zeigern 🙂

    Also ich versuche mal das Problem zu beschreiben, da ein Code nicht wirklich existiert, ich versuche auf Papier erstmal einen schnellen alghorithmus zu entwickeln.

    In eine Map sind Zellen eines Gitters gespeichert. in jeder Zelle sind die dazugehörigen 8 Knoten drin. -get-function existiert auch. Das aufrufen sieht dann so aus: cells->getcellnode(i) für 0<=i<=7.

    Ich suche nun zu jeder Node Nachbarnodes ( es gibt logischerweise max. 6 ).

    Wenn ich diese gefunden habe, will ich nicht ihre Koordinaten, oder ihren Index drin speichern, sondern einen Zeiger der auf diese Node zeigt. Der Gedanke dahinter ist folgender:

    Die Koordinaten werden sehr oft geändert und wenn man nur den Index speichert muss man immer nlog(n) Aufwand betreiben um diesen zu finden.

    Daher wäre es ja sinnvoller in first den Indes der Node zu speichern und in second Zeiger auf die Koordianten der Nachbarnodes.

    Soviel zur Theorie 🙂

    Ich hatte bisher eine Klasse die mir zu jedem Nodeindex seine projektionskoordinaten und anderen blödsinn speichern konnte.

    hier:

    public:
    	//Constructor
    	void addNode(unsigned long level_, unsigned long cellindex_, int triangle_, const Point& projected_, double dist_)
    	{
    		level = level_;
    		cellindex = cellindex_;
    		dist=dist_;
    		triangle=triangle_;
    		projected=projected_;
    	}
    	//Getfunctions
    	double GetDist() const {return dist;}
    
    	unsigned long getLevel() const { return level;}
    	unsigned long getCellIndex()const { return cellindex;}
    	Point getProjected() const{ return projected; }
    	int getTriangle() const { return triangle;}
    
    		unsigned long level; 
    		unsigned long cellindex;
    		double dist;
    		int triangle;
    		Point projected;
    
    };
    

    Wie schreibe ich das so um, dass ich nun Zeiger speichern kann?

    Gruß

    Alex



  • Lies dir mal durch was du dort gerade für ein wirrwar geschrieben hast, und versuche mal objektiv nachzuvollziehen, was du von uns möchtest! 😮



  • Der Mist von oben tut mir leid.

    Das verstehe ich mittlerweile selber nicht.

    Ich teile mein Problem mal anders auf.

    Ich brauche eine multimap die mir zu jedem Knotenindex eine map reinschreibt mit einem Nachbarindex in "first" und seinem Level und Cellinex in second.

    also quasi first1=Vaterindex,second1=(first2=Childindex,second2=Childlevel,Childcellindex)

    wenn ich meine Klasse von oben so umschreibe:

    class Neigbour
    {
    public:
        //Constructor
        void addNode(unsigned long level_,unsigned long cellindex_)
        {
            level = level_;
            cellindex = cellindex_;
        }
        //Getfunctions
        unsigned long getLevel() const { return level;}
        unsigned long getCellIndex()const { return cellindex;}
    
            unsigned long level;
            unsigned long cellindex;
    
    };
    

    dann erstelle ich die Multimap:

    map< unsigned long, map< unsigned long, Neighbour >> NeighbourMap;
    

    nun erzeuge ich ein Object dieser Klasse mit Neighbour neighbourfill

    und versuche über neighbourfill.addnode das ganze zu füllen.

    Aber über:

    Neighbour.insert( make_pair( Nodeindex, make_pair(Childindex,neighbourfill) ) );
    

    läuft das nicht.

    Vielleicht ist das Problem jetzt besser erklärt 🙂



  • Das geht so nicht, weil deine map, als zweiten Parameter eine map erwartet und kein pair aus Childindex und neighbourfill.

    map< unsigned long, pair< unsigned long, Neighbour > > NeighbourMap;
    

    Könnte zu dem von dir erwünschten Ergebnis führen.

    Aber irgendwie solltest du das Ganze nochmal überdenken.



  • Mir fällt einfach nichts anderes ein 😞

    Ich brauche eine multimap, die genau das tut 😞



  • Dann versuche es so und bitte beachte, dass ich deine map umbenannt habe.

    map < unsigned long, map < unsigned long, Neighbour > > NeighbourMaps;
    map < unsigned long, Neighbour > NeighbourMap;
    
    NeighbourMap.insert(make_pair(Childindex, neighbourfill));
    
    NeighbourMaps.insert(make_pair(Nodeindex, NeighbourMap));
    


  • ich versuche es!

    Danke für deine Hilfe.

    Edit:

    bei 24000 maps ist diese multimap viel zu lansgam 😞



  • hat einer eine Idee wie man das ganze schneller machen kann?

    Zur Zeit dauert es 12 Minuten bis die multimap voll ist und das geht nicht 😞



  • Hast du etwas anderes erwartet? Entweder keine Map verwenden, deinen Algorithmus zu optimieren ist die gescheiteste Idee. Oder ein eigener Allocator, bzw. mit stabileren Speichergrößen arbeiten.



  • erwartet habe ich nichts erstmal 🙂

    ich laufe halt im worst case 36*n² bei n= 25000 ist das halt echt bitter.

    ich muss mal gucken, ob ich in dem CFD mir etwas ausgeben kann, sodass ich das ganze nur auslesen muss.


Anmelden zum Antworten