array oder vector funktion?



  • Guten Abend!

    Gibt es sowas wie

    vector funktion(...)
    {
      return vector;
    }
    

    also letztendlich eine Funktion, die in der Lage ist, einen Vector oder Array zu returnen.

    Vielen Dank schonmal!



  • Ja, gibt es.



  • #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<int> f( )
    {
        vector<int> test;
        test.push_back( 1 );
        test.push_back( 25 );
        return test;
    }
    
    int main( )
    {
        vector<int> a = f( );
        cout << a[0] << a[1];
    }
    

    warum sollte das auch nicht gehen?



  • Vielen Dank, jungs 🙂



  • borg schrieb:

    vector<int> f( )
    //...
    [/cpp]
    warum sollte das auch nicht gehen?

    wieso ratest du das, was du selber nie benutzen wirst???



  • ssm schrieb:

    wieso ratest du das, was du selber nie benutzen wirst???

    öh, naja er hat gefragt ob man einen vector zurückgeben kann und ich hab ihm gezeigt wie es geht.
    das es langsam ist andauernd vectoren hin und her zu kopieren dürfte klar sein.



  • also an den threadersteller:
    so ist das natürlich uncool weil langsam. man macht das normalerweise so

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void f( vector<int>& test )
    {
        test.push_back( 1 );
        test.push_back( 25 );
    }
    
    int main( )
    {
        vector<int> a;
        f( a );
        cout << a[0] << a[1];
    }
    


  • das ist dann so eine Art Pointer?

    * kann man da nicht benutzen?

    edit: ok * würde ja den wert ausgeben, wir übergeben jedoch lediglich die adresse...



  • snake4ever schrieb:

    das ist dann so eine Art Pointer?

    * kann man da nicht benutzen?

    edit: ok * würde ja den wert ausgeben, wir übergeben jedoch lediglich die adresse...

    Klar, geht auch.

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void f( vector<int>* test )
    {
        test->push_back( 1 );
        test->push_back( 25 );
    }
    
    int main( )
    {
        vector<int> a;
        f( &a );
        cout << a[0] << a[1];
    }
    

    Ist aber nicht allzu sinnvoll, außer du hast eine Funktion wo der Parameter "optional" sein soll. (Von wegen f(0).)



  • ssm schrieb:

    borg schrieb:

    vector<int> f( )
    //...
    [/cpp]
    warum sollte das auch nicht gehen?

    wieso ratest du das, was du selber nie benutzen wirst???

    Warum würdest du das denn nicht benutzen? Doch hoffentlich nicht nur wegen eines möglichen Performance-Problems, oder?
    Zum einen gibt es nicht um sonst sowas wie (N)RVO und zum Anderen weißt du doch gar nicht, ob f() für die Performance des Programms überhaupt eine Rolle spielt (Stichwort: 80-20-Regel).

    borg schrieb:

    so ist das natürlich uncool weil langsam. man macht das normalerweise so

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void f( vector<int>& test )
    {
        test.push_back( 1 );
        test.push_back( 25 );
    }
    
    int main( )
    {
        vector<int> a;
        f( a );
        cout << a[0] << a[1];
    }
    

    Ob man das so macht sei mal dahingestellt. Ich für meinen Teil bevorzuge erstmal hübschen Code. Wenn sich dann herausstellt - und zwar nach dem ich mit realistischen Daten profiled habe -, dass der hübsche Code nicht schnell genug ist, kann ich nachher immernoch solche "wie-umgehe-ich-Unzulänglichkeiten-meiner-Programmiersprache"-Tricks anwenden.

    Etwas anderes ist es natürlich, wenn f() Teil einer von mir erstellten Bibliothek wäre. Da kann man auch ruhig mal etwas vorzeitig optimieren. Auf der anderen Seite würde ich in diesem Fall dann doch lieber gleich mit einem Iterator arbeiten. Dann ist der Aufrufer auch nicht gleich auf einen bestimmten Container festgelegt.



  • HumeSikkins schrieb:

    Ob man das so macht sei mal dahingestellt. Ich für meinen Teil bevorzuge erstmal hübschen Code. Wenn sich dann herausstellt - und zwar nach dem ich mit realistischen Daten profiled habe -, dass der hübsche Code nicht schnell genug ist, kann ich nachher immernoch solche "wie-umgehe-ich-Unzulänglichkeiten-meiner-Programmiersprache"-Tricks anwenden.

    Etwas anderes ist es natürlich, wenn f() Teil einer von mir erstellten Bibliothek wäre. Da kann man auch ruhig mal etwas vorzeitig optimieren. Auf der anderen Seite würde ich in diesem Fall dann doch lieber gleich mit einem Iterator arbeiten. Dann ist der Aufrufer auch nicht gleich auf einen bestimmten Container festgelegt.

    ich glaube jetzt übertreibst du aber, ich geb dir zwar grundsetzlich recht, lieber "hübschen" code als undurchsichtigen, evtl. fehleranfälligen und minimal schnelleren.

    void f( vector<int>& test )
    ...
    vector<int> a;
    f( a );
    --------------------------
    vector<int> f( )
    ...
    vector<int> a;
    a = f( );
    

    allerdings ist der untere code imo weder undurchsichtig noch fehleranfällig. ich kann noch nichtmal sagen das ich eine von beiden varianten in irgendeiner weise hübscher finde. warum sollte ich dann nicht die schnellere variante nehmen?
    ein "wie-umgehe-ich-Unzulänglichkeiten-meiner-Programmiersprache"-Trick ist es nicht, die programmiersprache ist halt so aufgebaut das man es so machen soll, ich umgehe nichts.


Anmelden zum Antworten