Lokale Deklaration von Variablen vermeiden



  • Hallo zusammen,

    Ich hätte eine Frage bzgl. dem Vermeiden von lokalen Deklarationen und gutem Programmierstil. Angenommen ich habe zwei Vektoren und möchte diese elementweise addieren. Dafür schreibe ich mir die entsprechende Funktion, die die beiden Vektoren als Referenz bekommt. In der Funktion deklariere ich einen Ergebnisvektor, der die Additionsergebnisse bekommt. Diesen gebe ich dann per return zurück.
    Das erzeugt mir dann ja kurzfristig drei Vektoren und kann den Speicher bei sehr großen Vektoren nach oben treiben. Was wäre jetzt ein guter Stil, um die lokale Deklaration in der Funktion zu vermeiden? Ich könnte natürlich einen der Eingabevektoren in der Funktion direkt ändern, weiß aber nicht ob das so üblich und "schön" ist. Kennt ihr noch Wege?

    Viele Grüße
    Desert Storm



  • Es ist eben die Frage, ob du a += b oder a + b rechnen willst. Wenn du nur ersteres haben willst, ist es in der Regel auch besser/einfacher inplace zu rechnen. Wenn du a+b berechnen willst, kannst du den +-Operator häufig als c=copy(a), c+=b implementieren.



  • Desert Storm schrieb:

    Das erzeugt mir dann ja kurzfristig drei Vektoren

    Nein



  • Desert Storm schrieb:

    Hallo zusammen,

    Ich hätte eine Frage bzgl. dem Vermeiden von lokalen Deklarationen und gutem Programmierstil. Angenommen ich habe zwei Vektoren und möchte diese elementweise addieren. Dafür schreibe ich mir die entsprechende Funktion, die die beiden Vektoren als Referenz bekommt. In der Funktion deklariere ich einen Ergebnisvektor, der die Additionsergebnisse bekommt. Diesen gebe ich dann per return zurück.
    Das erzeugt mir dann ja kurzfristig drei Vektoren und kann den Speicher bei sehr großen Vektoren nach oben treiben. Was wäre jetzt ein guter Stil, um die lokale Deklaration in der Funktion zu vermeiden? Ich könnte natürlich einen der Eingabevektoren in der Funktion direkt ändern, weiß aber nicht ob das so üblich und "schön" ist. Kennt ihr noch Wege?

    Viele Grüße
    Desert Storm

    Lange Rede, kurzer Sinn: Sowas hier?

    std::vector<int> add (const std::vector<int> & a, const std::vector<int> & b)
    {
    	std::vector<int> result;
    
    	//	sicherstellen, dass a und b gleiche Laenge haben
    	//	result.resize()
    	//	result[i] = a[i] + b[i] fuer alle i
    
    	return result;
    }
    

    Ja, das erzeugt einen dritten Vektor und ja, bei bei langen Vektoren braucht das viel Speicher. Das ist aber keine Frage von "schön" oder "gutem Stil", sondern davon, was gefordert ist.

    Wenn die Operation c = a + b realisiert werden soll (mit a und b unverändert), dann geht es nicht anders. Wenn es auch a = a + b sein darf (a wird verändert), dann kann man auch so schreiben:

    void add (std::vector<int> & a, const std::vector<int> & b)
    {
    	//	sicherstellen, dass a und b gleiche Laenge haben
    	//	a[i] = a[i] + b[i] fuer alle i
    	//	keine Rueckgabe, die wuerde hier nur verwirren.
    }
    

    So oder so sollte man mit dem Return-Type und mit der const-Auszeichnung der Argumente die Arbeitsweise der Funktion klarstellen.



  • Vielen Dank für die schnelle Hilfe. Denn war ich ja doch gar nicht so falsch. Denn werde ich meinen Code mal überarbeiten, um Speicher zu sparen:)


Log in to reply