Vektoren initialisieren?



  • Sone schrieb:

    // Nicht-C++11 Krücke: 
    template< typename T > 
    class make_vector_t 
    { 
        private: 
            std::vector< T > data; 
      
        public: 
            make_vector_t( T const & value ) { data.push_back( value ); } 
            make_vector_t< T > & operator,( T const & value ) { data.push_back( value ); return *this; } 
            operator std::vector< T >() { return data; } 
    }; 
      
    template< typename T > 
    make_vector_t< T > make_vector( T const & value ) { return make_vector_t< T >( value ); }
    

    Beispiel (ungetestet):

    std::vector<int> foo(( make_vector(0), 1, 2, 3 ));
    

    Funzt, ist allerdings wahrlich unschön, einerseits wegen des schrittweisen Aufbaus des Vektors, andernseits wegen der Parameterübergabe, welche zusätzliche Klammern erfordert und der übergebene Wert an make_vector zwingend genau den gleichen Typ wie der Zielvektor haben muss.



  • Ich würde die angedeutete aber nicht gezeigte Methode mit begin und end bevorzugen.

    double data[] = {1.1, 2.2, 3.3, 4.4, 5.5};
    //vector<double> vec(data, data + sizeof(data)/sizeof(*data));  // Oder schöner mit begin und end, falls das unterstüzt wird.
    vector<double> vec(begin(data), end(data)); //sieht hübscher aus
    


  • Die C++03-Variante: Boost.Assign





  • Vielleicht ist std::array ja etwas für dich, denn da funktioniert die Initalisierung auch in Visual Studio.



  • Die Initialisierung funktioniert generell in Visual Studio, nur eben nicht mit der Version, die er benutzt...


  • Mod

    nwp3 schrieb:

    Ich würde die angedeutete aber nicht gezeigte Methode mit begin und end bevorzugen.

    double data[] = {1.1, 2.2, 3.3, 4.4, 5.5};
    //vector<double> vec(data, data + sizeof(data)/sizeof(*data));  // Oder schöner mit begin und end, falls das unterstüzt wird.
    vector<double> vec(begin(data), end(data)); //sieht hübscher aus
    

    Ich würde vermuten, dass ein Compiler, der initializer lists nicht kennt, auch kein begin und end kennt. Daher habe ich es nur angedeutet. Wenn man initializer lists hat, sind diese hier zu bevorzugen.

    Mag sein, dass diese spezielle MSVC-Version genau so ein Grenzfall ist, wo eines vorhanden ist, das andere nicht. Das ist dann aber schon sehr speziell.

    dot schrieb:

    Die Initialisierung funktioniert generell in Visual Studio, nur eben nicht mit der Version, die er benutzt...

    Ich hatte da heute Morgen, als ich sagte, dass es ein Update gäbe, meine ich gelesen, dass es wirklich nur vector betrifft.



  • MSVC kennt begin/end seit zwei Revisionen, Initialiser Lists gibts dagegen erst in der kommenden Version, die im Moment als Preview verfügbar ist... 😉

    SeppJ schrieb:

    dot schrieb:

    Die Initialisierung funktioniert generell in Visual Studio, nur eben nicht mit der Version, die er benutzt...

    Ich hatte da heute Morgen, als ich sagte, dass es ein Update gäbe, meine ich gelesen, dass es wirklich nur vector betrifft.

    Ich habs natürlich ausprobiert, zumindest mit meinem simplen Testbeispiel gabs in VS 2013 keine Probleme...



  • SeppJ schrieb:

    Fabolous12 schrieb:

    Hey, ich arbeite zur Zeit mit Visual Studio 2012 - Express und habe leider noch nicht die Möglichkeit Vektoren folgendermaßen zu initialisieren :

    Laut Patchnotes sollte im herbst 2012 ein Update erschienen sein, welches dies ermöglicht. Ich habe VS nicht, um das zu überprüfen, aber würde mich wundern, wenn das nicht stimmen würde.

    Herbert Sutter ist alles zuzutrauen:
    http://blogs.msdn.com/b/vcblog/archive/2012/11/02/visual-c-c-11-and-the-future-of-c.aspx
    Versprochen und nicht geliefert, also Note 6 setzen.

    SeppJ schrieb:

    Einfach mal ein Update machen?

    Hilft nichts, im CTP für Update 1 versprochen aber selbst im Update 3 ein halbes Jahr später immer noch keine initializer_lists.
    Ist sowieso Schwachsinn, ein Preview zu einem Update.

    double data[] = {1.1, 2.2, 3.3, 4.4, 5.5};
    vector<double> vec(data, data + sizeof(data)/sizeof(*data));  // Oder schöner mit begin und end, falls das unterstüzt wird.
    

    Im VisualC++ geht es auch kürzer:

    double data[] = {1.1, 2.2, 3.3, 4.4, 5.5};
    vector<double> vec(data, data + _countof(data) );
    

    Mit VS2013 funktioniert dann endlich auch:

    vector<double> v1 = {1.1, 2.2, 3.3, 4.4, 5.5};
    


  • Wutz, richtig muß es aber wohl so geschrieben werden:

    double data[] = {1.1, 2.2, 3.3, 4.4, 5.5};
    vector<double> vec(data, data + _countof(data) );
    

Anmelden zum Antworten