STD Vektor mit Array initialisieren



  • Hallo.

    Zu dieser Frage gibt es schon viele Diskussionen im Netz, aber keine Antwort stellt mich zufrieden. Ich möchte einen std::vector anlegen, der direkt auf einem gegeben Array arbeitet, ohne diesen nochmal zu kopieren. Leider schaffe ich das nicht. Es gibt die Methode vector<T>::assign, der ich Anfang und Ende eines Arrays übergeben kann, aber dann kopiert er ebenfalls.

    Hier mal ein Minimalbeispiel:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
      typedef vector<int> Vector;
    
      int data[] = {1, 2, 3, 4, 5};
    
      Vector vec;
      vec.assign(data, data+5);
    
      data[3] = 10;
    
      cout << "Data: ";
      for(Vector::const_iterator it = vec.begin(), it_end = vec.end();
          it != it_end; ++it)
        {
          cout << *it << " ";
        }
      cout << endl;
    
      cout << "Address Array  : " << data << endl;
      cout << "Address Vector : " << &(vec[0]) << endl;
    }
    

    Es kommt immer 1 2 3 4 5 raus, obwohl ich gern 1 2 3 10 5 hätte. Die Adressen sollen am Ende auch gleich sein.

    Geht soetwas überhaupt?
    Ich habe mir schon überlegt was der Destruktor machen würde: und zwar das Feld deallokieren. Das wäre natürlich fatal, wenn der User das vorher schon selbst getan hat. Darum kann man natürlich darüber diskutieren, ob so eine Funktion gewollt ist.

    Hat jemand eine Idee?

    Danke schonmal.

    Grüße
    Max



  • std::vector macht immer eine Kopie der Daten, die du ihm gibst. Daran kannst du wohl nichts ändern.



  • Mal ne Gegenfrage: Wieso brauchst du das überhaupt? Haben wir hier etwa wieder ein XY-Problem 😛



  • Ich dachte es wäre effizienter und an dem Feld ändert sich in meinem Programm sowieso nichts mehr.

    Wozu ich das brauche:
    Ich habe 3 Felder die eine Matrix im Compressed Row Storage (CRS)-Format darstellen sollen. Die werden von einem Finite-Elemente-Paket (das ist quasi die Steifigkeitsmatrix zu meiner Differentialgleichung) berechnet. Jetzt nehme ich die MTL 4 (Matrix Template Library) her, um mit dieser Matrix weiter zu rechnen. MTL speichert diese 3 Felder allerdings in Form eines std::vector's.


Anmelden zum Antworten