werden bei std::map Daten kopiert?



  • Hallo Leute,

    wenn ich in einer std::map Werte/Objekte einfüge, werden diese kopiert oder wird da nur irgendeine Referenz verwendet? Wird da auch ein Copyconstruktor verwendet?

    Ich möchte gerne sowas machen (habe mit maps nur wenig gearbeitet):

    class Daten
    {
    public:
    	Daten():val(0){}
    	~Daten(){}
    
    	int val; // ja ist hier mal öffentlich gemacht ;)
    };
    
    class MeineKlasse
    {
    public:
    	MeineKlasse(){}
    	~MeineKlasse(){}
    
    	void setDaten(int id, Daten const &daten) // neue hinzufügen / bestehende überschreiben
    	{
    		meineMap[id] = daten;
    	}
    
    	Daten getDaten(int id) const
    	{
    		if (meineMap.find(id) == meineMap.end())
    		{
    			throw "Fehler";
    		}
    		return meineMap.at(id);
    	}
    
    	Daten &getDatenReferenz (int id)  // oder lieber so?
    	{
    		if (meineMap.find(id) == meineMap.end())
    		{
    			throw "Fehler";
    		}
    		return meineMap.at(id);
    	}
    
    	void verarbeiteDaten(int id)
    	{
    		if (meineMap.find(id) != meineMap.end())
    		{
    			// variante 1: direkt schreiben
    			meineMap.at(id).val = 123456;
    
    			// variante 2: kopie anlegen und anschließend wieder einfügen
    			Daten daten1 = meineMap.at(id);
    			daten1.val = 123456;
    			setDaten(id, daten1);
    
    			// variante 3: mit referenz
    			Daten &daten2 = meineMap.at(id);
    			daten2.val = 123456;
    			setDaten(id, daten2); // --> diese Zeile müsste doch überflüssig sein, oder?
    		}
    	}
    
    private:
    	std::map <int, Daten> meineMap;
    };
    

    Anwendung:

    MeineKlasse mk;
    Daten daten;
    
    daten.val = 12345;
    
    // wert setzen
    mk.setDaten(123, daten);
    

    Wird jetzt eine Kopie von 'daten' angelegt? Braucht man einen speziellen konstruktor? Wie sieht es mit dem Freigeben aus. Muss ich da auch etwas beachten? 😕

    viele Grüße,
    SBond



  • Ja, es wird kopiert.

    Was sollen die leeren Konstruktoen und Destruktoren?



  • manni66 schrieb:

    Ja, es wird kopiert.

    Was sollen die leeren Konstruktoen und Destruktoren?

    super. Die haben keine weiteren Bedeutung. Habe das Beispiel schnell zusammengetippt.



  • SBond schrieb:

    manni66 schrieb:

    Ja, es wird kopiert.

    Was sollen die leeren Konstruktoen und Destruktoren?

    super. Die haben keine weiteren Bedeutung. Habe das Beispiel schnell zusammengetippt.

    Jemanden, der leere Konstruktoen und Destruktoren schreibt, wenn er "das Beispiel schnell zusammengetippt", verdächtige ich, dies gewohnheitsmäßig zu tun 😉



  • manni66 schrieb:

    Jemanden, der leere Konstruktoen und Destruktoren schreibt, wenn er "das Beispiel schnell zusammengetippt", verdächtige ich, dies gewohnheitsmäßig zu tun 😉

    Ja... dafür bin ich in der Tat unglaublich anfällig. Wahrscheinlich kommt es daher, dass man so etwas häufig in tutorials/Beispiele sieht. Habe es mir irgendwie so angewöhnt 😞
    Ist das eigentlich problematisch oder einfach nur überflüssig ...so ein leerer konstruktor?

    ...ich würde zu gene wissen was ich sonst noch so für dumme Designfehler mache. In 10 Jahren werde ich wahrscheinlich über meinen eigenen Code den Kopf schütteln.



  • SBond schrieb:

    ...ich würde zu gene wissen was ich sonst noch so für dumme Designfehler mache. In 10 Jahren werde ich wahrscheinlich über meinen eigenen Code den Kopf schütteln.

    Gib dir ein halbes Jahr, und du wirst dich selbst verfluchen. :p



  • Lass leere Konstruktoren einfach weg.

    Oder schreib explizit hin, dass du den Default-Konstruktor haben willst:

    class Kasse {
        Klasse() = default;
    ...
    }
    

    Siehe z.B. hier, warum das einen Unterschied machen kann (schau dir die Beispiele an):
    http://en.cppreference.com/w/cpp/language/value_initialization



  • oh ha...

    gut zu wissen. Da kann ich mir ja das manuelle initialisieren der Variablen ja sparen. 🙄


Log in to reply