Struktur-Vektor: Argument an die Methode push_back?



  • Hi,

    ich möchte einen Vektor von POINT-Strukturen anlegen und ein Element hinzufügen. Ersteres ist mir schon gelungen nur bei dem Auruf der Methode push_back weiß ich nicht so recht wie das Argument aussehen muss (keine Parameterliste, sondern einen Aufruf an diesem konkreten Beispiel). 😕

    vector<POINT> pt ;
    
    // pt.push_back(???) ;
    

    MfG WilMen



  • Wie ist POINT denn definiert (als reine Struktur (die WinAPI-Struktur) oder mit Konstruktor)?

    Hier mal beide Möglichkeiten:

    POINT p;
    p.x = 42;
    p.y = 10;
    
    pt.push_back(p);
    

    oder

    POINT p(42, 10);
    
    pt.push_back(p);
    
    // oder direkt
    pt.push_back(POINT(42, 10));
    


  • Danke, man habe ich mich blöd angestellt :p . POINT ist eine reine Win32-API Struktur.

    Jetzt habe ich aber noch eine Frage.

    Th69 schrieb:

    POINT p;
    p.x = 42;
    p.y = 10;
    
    pt.push_back(p);
    

    Gibt es hier eine Möglichkeit sich das Anlegen von p zu sparen und irgendwie direkt ein Argument zu übergeben, also ohne Variablen, wenn ich jetzt z.B. will, dass x gleich 10 ist und y gleich 20?

    MfG WilMen



  • POINT p = {2, 3};
    

    Da POINT ja keinen ctor hat, kann man es nicht direkt angeben. Aber könntest mal was mit casting rumprobieren..



  • WilMen schrieb:

    Danke, man habe ich mich blöd angestellt :p . POINT ist eine reine Win32-API Struktur.

    Jetzt habe ich aber noch eine Frage.

    Th69 schrieb:

    POINT p;
    p.x = 42;
    p.y = 10;
    
    pt.push_back(p);
    

    Gibt es hier eine Möglichkeit sich das Anlegen von p zu sparen und irgendwie direkt ein Argument zu übergeben, also ohne Variablen, wenn ich jetzt z.B. will, dass x gleich 10 ist und y gleich 20?

    MfG WilMen

    ?? das hat doch Th68 geschrieben...

    // oder direkt
    pt.push_back(POINT(42, 10));
    


  • @Dragon

    Das weiß ich 😃 ! Du hast mich nicht verstanden! :p

    // pt.push_back(???) ;
    

    Setze bitte für die drei Fragezeichen einen Ausdruck ein, ohne weitere Code-Zeilen (Variablendeklarationen/-Initialsierungen) hinzuzufügen!

    MfG WilMen



  • sry. Habe nicht alles gelesen, bevor ich geschrieben habe, aber ich habe je editiert..;)

    Naja. Sonst fällt mir nichts mehr ein, ausser eine eigene POINT struktur zu schreiben. Sollte ja nicht so schwer sein die zu erweitern. 😉

    btw. ich heises drakon und nicht dragon..;)



  • @muffmolch

    Könnt ihr bitte alles lesen 😉 ? Es handelt sich um ein reine Win32-API-Struktur ohne Konstruktor!

    MfG WilMen



  • Sorry drakon 😃 !

    Ja, das schreiben einer POINT-Klasse mit Konstruktor ist kein Problem, aber ich möchte es halt mit dem schon vorhandenen Mitteln versuchen! 🙂

    EDIT: Sorry für das Doppel-Posting, aber ich dachte es könnte in der Zeit schon wieder jemand anders geschrieben haben und das, was ich sagen wollte, würde dann untergehen. :p

    MfG WilMen



  • WilMen schrieb:

    Sorry drakon 😃 !

    Ja, das schreiben einer POINT-Klasse mit Konstruktor ist kein Problem, aber ich möchte es halt mit dem schon vorhandenen Mitteln versuchen! 🙂

    MfG WilMen

    Naja. Also imho kann man diese POINT struktur wegschmeissen. Da hast du in 5 Minuten was bessers gemacht. 😉
    Sprich: Mir fällt gerade nichts ein, wie man das ohne ctor machen könnte. Ev. weiss sonst jemand einen Hack, aber naja.. Bei so was trivialem.. 🙄



  • Ja stimmt, aber gibt es nun einen Möglichkeit, dass so, wie ich es mir vorstelle, umzusetzten oder nicht?

    MfG WilMen



  • Ohne eigene Klasse mit Konstruktor anzulegen, bleibt dir noch die Möglichkeit einer Hilfsfunktion:

    POINT make_point(int x, int y)
    {
        POINT p = {x, y};
        return p;
    }
    //...
    points.push_back(make_point(12, 24));
    

    Der Kompiler wird die Funktion vermutlich wegoptimieren, so dass dadurch kein Overhead entsteht.

    Gruß
    Don06



  • Sehr gute Idee! Was ist jetzt aber besser? Du sagst ja, dass die Funktion wahrscheinlich wegoptimiert wird. Verhält es sich bei der Klasse-mit-Konstruktor-Variante dann genauso?

    Hier meine POINT-Klasse:

    typedef class POINT
    {
    	public:
    	int x ;
    	int y ;
    
    	POINT(int cx, int cy)
    	{
    		x = cx; 
    		y = cy ;
    	}
    } ;
    

    MfG WilMen



  • Dann sollte man die Funktion auch mit "inline" anlegen, um dem Compiler einen Tipp zu geben (andernfalls würde das POINT-Objekt zweimal kopiert werden, ehe es im vector landet).

    Ich würde einfach eine neue Struktur mit Konstruktor anlegen, welche von POINT erbt:

    struct Point : public POINT
    {
      Point(int px, int py)
      {
        // Init.liste funktioniert nicht, da x und y keine direkten Member sind
        x = px;
        y = py;
      }
    };
    

    d.h. es ist eine POINT-Struktur, kann aber direkt angelegt werden.


  • Mod

    Th69 schrieb:

    Dann sollte man die Funktion auch mit "inline" anlegen, um dem Compiler einen Tipp zu geben (andernfalls würde das POINT-Objekt zweimal kopiert werden, ehe es im vector landet).

    Das hat mit inline nichts zu tun. Sofern der Compiler NRVO beherrscht, ist diese Variante nicht weniger effizient als die Verwendung eines selbstdefinierten Konstruktors.


  • Mod

    Th69 schrieb:

    d.h. es ist eine POINT-Struktur, kann aber direkt angelegt werden.

    Gegenüber einer Hilfsfunktion wie oben besteht aber keinerlei Vorteil, im Gegenteil.


Anmelden zum Antworten