Pointer auf std::vector übergeben



  • Hallo Leute,

    ich habe mal wieder ein kleines Problem bei dem ich nicht weiterkomme. Wenn ich eine Funktion habe in der ein std::vector erstellt wird, kann ich dann einen Pointer auf diesen vector übergeben und bleibt dann der Speicher auch in der Main reserviert ? Ein Beispiel wäre:

    #include <vector>
    
    std::vector <double>* test_Funktion(){
    
        std::vector <double> testVariable = {0,2,5,15};
    
    return &testVariable;
    }
    
    int main[]{
    
        std::vector <double>* variable;
    
        variable = test_Funktion();
    
        std::cout << *variable.size() ; //Dies funktioniert nicht !?
    
    return 0;
    }
    

    Also ich habe noch nicht verstanden ob das A überhaupt funktioniert und B ob dann in der Main der Speicher für die vier Double Variablen, bzw. für den vector in denen die vier Double Werte stehen reserviert bleibt.

    Ich hoffe meine Frage wird deutlich. Ich entschuldige mich falls ich einen dummen Anfängerfehler gemacht habe der für euch offensichtlich ist und bedanke mich recht herzlich für eure Hilfe.

    Beste Grüße und ein schönes Wochenende!
    rob



  • EDIT: Vergessen: der Grund warum ich nicht das Array übergeben möchte ist um zu verhindern, dass es komplett kopiert wird. Vielleicht hilft die Info.

    Grüße
    rob



  • Nein. Du gibst einen Pointer auf eine Lokale Variable zurück, da ist es ganz egal was das ist.

    rob...o.0 schrieb:

    EDIT: Vergessen: der Grund warum ich nicht das Array übergeben möchte ist um zu verhindern, dass es komplett kopiert wird. Vielleicht hilft die Info.

    Grüße
    rob

    Ein Vector ist kein Array. Move es raus oder returne es einfach so und lass NRVO seinen Job machen.



  • Kaum jeman wird das als übergeben bezeichnen. Besser wäre zurückgeben.

    Selbstverständlich ist wie immer falsch, wenn man einen Zeiger auf eine lokale Variable zurückliefert!

    Das sollte jeder Compiler ohne kopieren hinbekommen:

    #include <vector> 
    
    std::vector <double> test_Funktion(){ 
    
        std::vector <double> testVariable = {0,2,5,15}; 
    
    return testVariable; 
    } 
    
    int main[]{ 
    
        std::vector <double> variable = test_Funktion(); 
    
        std::cout << variable.size() ; //Dies funktioniert nicht !? 
    }
    


  • Hust... ich sagte ja Anfängerfehler 😉 Also habe ich das richtige verstanden: ich returne ganz normal die vector<double> klasseninstanz und schwups checkt der Compiler, dass er nicht alle Werte neu kopieren muss ?!

    Danke! Ihr seid klasse.



  • rob...o.0 schrieb:

    Also habe ich das richtige verstanden: ich returne ganz normal die vector<double> klasseninstanz und schwups checkt der Compiler, dass er nicht alle Werte neu kopieren muss ?!

    Noe, wenn du Glueck hast checkt er das.



  • TGGC schrieb:

    rob...o.0 schrieb:

    Also habe ich das richtige verstanden: ich returne ganz normal die vector<double> klasseninstanz und schwups checkt der Compiler, dass er nicht alle Werte neu kopieren muss ?!

    Noe, wenn du Glueck hast checkt er das.

    Wenn man einen aktuellen Compiler benutzt dann hat man aber meistens Glück. Außerdem ist glaube ich seit C++11 wenigstens ein move garantiert wenn RVO nicht klappt.

    An den TO: Schreibe es einfach so mit dem normalen return und wenn du wirklich absolut den schnellsten Code brauchst und du glaubst es liegt am return vom vector: Nachmessen und/oder ins Assembly schauen. Als Anfänger braucht man aber das aber eher nicht.



  • sebi707 schrieb:

    An den TO: Schreibe es einfach so mit dem normalen return und wenn du wirklich absolut den schnellsten Code brauchst und du glaubst es liegt am return vom vector: Nachmessen und/oder ins Assembly schauen. Als Anfänger braucht man aber das aber eher nicht.

    QFT


Log in to reply