Getfunction für eine map



  • Hi Leute,

    ich bekomme langsam einen Knoten ins Hirn

    struct PtEntry
    {
        struct InTriangle
        {
    
            int triangle;
            Point projected;
            double dist;
            InTriangle(int triangle_, const Point& projected_, double dist_)
                : 
            triangle(triangle_), projected(projected_), dist(dist_){}
    
        };
    
        list<InTriangle> entries;
        inline double getDest() {return dist;}
        void addNode(int triangle_, const Point& projected_, double dist_)
        {
            InTriangle node(triangle_, projected_, dist_);
    
            entries.push_back(node);
    
        }
        void clear(int triangle_, const Point& projected_, double dist_)
        {
    
            entries.clear();
    
        }
    
    };
    

    nun erstelle ich eine map

    map<unsigned long, PtEntry> projectInTriangleMap;

    und kann dann über :

    entry.addNode(*j, projected, distance );
                                            projectInTriangleMap.insert(make_pair(index, entry));
    

    auch Dinge in die map knallen

    nur mein getDest funktioniert nicht, da die Variable ja in dem falschen struct definiert worden ist. Die über InTriangle::dist geht ja auch nicht.

    Ich steh grad auf dem Schlauch.

    Danke im Vorraus



  • Welches dist soll denn auch von PtEntry::getDest() zurückgegeben werden? dist ist eine Variable von InTriangle und ein PtEntry-Objekt hält beliebig viele InTriangle-Objekte in einer Liste. Also hat ein PtEntry-Objekt auch beliebig viele verschiedene dist-"Member". Welches willst du denn dann mit getDest() liefern?

    BTW: Ich find deine Namenswahl nicht so schön. Was heißt "Pt" bei PtEntry? projected ist ein Adjektiv und kein Nomen, wie man es bei einem Point-Objekt erwartet (wenn ich den Datentyp von projected raten müsste, würde ich bool sagen). triangle ist vom Typ int, aber wie soll ein Dreieck eine Ganzzahl sein? getDest gibt dist zurück etc.



  • ja ich will aus der map zu einem bestimmten Schlüssel das dist aufrufen können.

    ja projected soll heißen "schon projeziert" und int triangle, weil es nur die nummer des Dreiecks angibt



  • Dann musst du noch den Schlüssel mitübergeben und nach diesem suchen:

    double getDist(const Key& myKey)
    {
    	list<InTriangle>::iterator iter = find(entries.begin(), entries.end(), myKey);
    	if(iter == entries.end())
    		nicht gefunden. Exception werfen oder irgendnen Defaultrückgabewert
    	else
    		return iter->dist;
    }
    

    Necrofighter schrieb:

    ja projected soll heißen "schon projeziert"

    Warum ist das dann ein Point-Objekt und kein bool?

    und int triangle, weil es nur die nummer des Dreiecks angibt

    Wie wärs mit id ?



  • Natürlich. Nur gibts entries.find nicht, entries ist ja vom Typ List

    aber war eigentlich logisch dass es über ein objekt gehen muss

    naja da werden x,y,z von projected gespeichert

    Ich schriebe also noch eine find function dann sollte es ja eigentlich klappen.

    Kann man die map nicht iwie einfacher gestalten, sodass ich einfach eine Getfunction hinschreiben kann, ohne den ganzen Aufwand?

    Also eine Map in die zu jedem Key eine Liste gespeichert werden soll.

    Ich bekomms nicht besser hin, und so ist die Getfunction zu schreiben reine Hölle für einen Neuling.



  • Necrofighter schrieb:

    Natürlich. Nur gibts entries.find nicht, entries ist ja vom Typ List

    Habs schon geändert. Du brauchst dann noch den Header <algorithm>.

    naja da werden x,y,z von projected gespeichert

    Und wie sieht das Objekt aus, wenn noch keine Projektion stattgefunden hat?

    Kann man die map nicht iwie einfacher gestalten, sodass ich einfach eine Getfunction hinschreiben kann, ohne den ganzen Aufwand?

    Also eine Map in die zu jedem Key eine Liste gespeichert werden soll.

    Dafür gibt es, glaubs oder nicht, den Datentype std::map 😉 Wenn deine Schlüssel einfach nur die Zahlen 0,...,n sind, dann kannst du das auch über einen std::vector machen.

    Wenn es zu einem Schlüssel mehrere Werte geben können soll, schau dir std::multimap an.



  • Ich danke dir schonmal....jetzt weint der Compiler noch weil Key natürlich nirgends definiert ist...

    der Punkt wurde da schon projeziert 🙂 die Punkte werden auf verschiedene Dreiecke projeziert und ich will die Entfernungen speichern, um dann den kürzesten Abstand auszuwählen.



  • Necrofighter schrieb:

    Ich danke dir schonmal....jetzt weint der Compiler noch weil Key natürlich nirgends definiert ist...

    Ich wusste nicht, was du als Key benutzen willst. Du kannst daraus z. B. int machen und dann die id übergeben.

    der Punkt wurde da schon projeziert 🙂

    Auch wenn ich die Funktion der Variablen nicht ganz verstehe: Wie wärs mit dem Namen projection ?

    Zum Sinn der Variablen: Du sagst durch die Member-Beziehung, dass ein Dreieck eine Projektion vom Typ Point hat. Wie sieht denn eine Projektion eines Dreiecks auf einen Punkt aus (vorausgesetzt, wir reden über denselben Raum)?



  • Nein Point projected gibt mir die Koordinaten des projezierten punktes auf das Dreieck mit der Nummer *j aus.

    Daher steht in der Map dann:

    First: Index des Punktes

    Second: Index vom Dreieck,

    Koordinaten des Punktes nach projektion auf das Dreieck

    Abstand Ausgangspunkt zum Projezierten Punkt


Anmelden zum Antworten