vector initialisieren



  • Bsp:

    std::vector<double> mvSource;
    
    .
    .
    .
    .
    .
    struct data{
       //Var
       double A;
       //Konstruktor
       data(double a) : A(a){}
    };
    
    std::vector<data> mvDest(mvSource.size(), /* HIER der double wert von jeweiligen mvSource element */);
    

    Es so nun der übergabe wert des Konstruktors von data entsprechend des inhalts des mvSource element am in Index x übergeben werden!

    sowas geht wohl nich????



  • Du willst mvDest als "Kopie von mvSource erstellen, richtig? Dafür gibt es den Bereichs-Konstruktor:

    vector<data> mvDest(mvSoruce.begin(),mvSource.end());
    


  • ne nich ganz

    nehmen wir an mcSoure hat 4 Elemente mit den double werten 5.0, 3.4, 1.3, 6

    wenn ich nun mvDest initialisieren will, soll

    für das erste elemente (data) der wert 5.0 im konstruktor übergeben werden,
    für das zweite elemente (data) der wert 3.4 , usw.



  • Sag ich doch - als "Kopie" (jedes Element von Dest wird aus dem entsprechenden Source-Element erzeugt). Bevor du "klappt nicht" schreist, solltest du den obigen Code wenigstens ausprobieren.



  • hmm ist wohl ein schlechtes beispiel

    sagen wir mal, der mvSource hätte statt double die struktur

    struct elem{
    
     double d;
     int i;
    
    };
    
    std::vector<elem> mvSource;
    

    dann will ich von jedmem elemente des mv Source den double wert als übergabe parameter der mvDest



  • Vielleicht so?

    struct elem{
    
     double d;
     int i;
    
     operator double ()
     {
      return d;
     }
    
    };
    


  • Wenn du data ändern kannst, könntest du ihm einen Ctor geben, der elem-Objekte entgegennehmen kann. Im Ernstfall bleibt dir immer noch die Möglichkeit, den vector über transform() zu füllen.



  • transform? kannst mal genauer erläutern?



  • transform() kann Bereiche "umrechnen". D.h. wenn du weder elem noch data ändern kannst, könntest du damit deinen vector umkopieren:

    struct elem
    {
      double d;
      int i;
    };
    class data
    {
      //Var
      double A;
    public:
      //Konstruktor
      data(double a) : A(a){}
    };
    
    data from_elem(elem val)
    { return data(val.d); }
    
    vector<elem> src;
    ...//fill src
    vector<data> tgt;
    transform(src.begin(),src.end(),back_inserter(tgt),from_elem);
    

    (benötigt <algorithm> (transform) und <iterator> (back_inserter))



  • Die Kristallkugel spricht...

    1. Du hast einen std::vector<double> mit irgendwelchen Werten initialisiert.
    2. Du hast eine Klasse, nennen wir sie Foo, deren Konstruktor ein Element vom Typ double verlangt.

    class Foo
    {
        // ...
    public:
        // ...
        Foo(double x);
        // ...
    };
    

    Nun willst du einen neuen std::vector<Foo> anlegen und Foo::Foo(double) mit den Werten aus std::vector<double> aufrufen:

    std::vector<double> src;
    // ...
    std::vector<Foo> dst;
    std::vector<double>::const_iterator iter = src.begin();
    for(; iter != src.end(); iter++) {
        dst.push_back(Foo(*iter, 1234));
    }
    

    Zumindest entspricht das dessen was ich mir gerade unter der Problemstellung vorstellen kann - und vermutlich gibt es ein Funktion/Methode von std::vector, welche genau das zu leisten vermag 😉

    Grüße...

    Heiko



  • @CStoll: Elengant;) thx

    @Rest: danke:)


Anmelden zum Antworten