Array kopieren



  • Wenn ich mit vector ein Array definiere:

    vector<vector<double> > m_ArrayOne; 
    vector<vector<double> > m_ArrayTwo;
    

    was passiert dann bei

    m_ArrayTwo = m_ArrayOne;
    

    wird das Array Zellenweise kopiert oder nur der Pointer auf das Array. Ich benötige ein schnelles kopieren und möchte daher das m_ArrayTwo identisch mit m_ArrayOne ist.

    Ich benötige das z.B. bei

    void CGraphCtrl::SetPlotDataPhase(vector<vector<CComplex> > &InputArray)
    {
       m_PlotData = InputArray;
    }
    

    wo ein Array an eine Klasse übergeben wird.

    Matthias


  • Mod

    Es wird ein neuer Array allokiert und die Daten memberweise kopiert.

    Es ist nicht möglich nur den Zeiger umzusetzen.
    Du kannst sicherlich die swap Funktion verwenden, wenn dies Deiner Funktionalität gerecht wird.



  • Martin Richter schrieb:

    Es wird ein neuer Array allokiert und die Daten memberweise kopiert.

    Es ist nicht möglich nur den Zeiger umzusetzen.
    Du kannst sicherlich die swap Funktion verwenden, wenn dies Deiner Funktionalität gerecht wird.

    Wenn ich die Doku richtig verstanden habe dann bewirkt ein

    vector<vector<double> > m_ArrayOne; 
    vector<vector<double> > m_ArrayTwo;
    ...
    m_ArrayOne.swap(m_ArrayTwo);
    

    das in m_ArrayTwo die Inhalte von m_ArrayOne stehen.

    Die Frage die sich mir dabei stellt ist ob die Geschwindigkeit besser ist als bei m_ArrayTwo = m_ArrayOne;

    Hintergrund: Ich habe von C-Arrays ala

    int (*pArr)[5];
    

    nach vector Arrays gewechselt weil mir das hier mehrfach ausdrücklich empfohlen wurde. Daher habe ich es dahingehend umgeschriebe. Jetzt muss ich feststellen, dass man damit sehr schön resizen kann und auch ein kopieren implementiert ist - das allerdings sehr langsam da Elementweise.

    Ich verwende Arrays in mehreren Klassen die zwischen diesen ausgetaucht werden. Die Größen der Arrays sind dabei immer dieselben. Wenn diese bei jedem Austausch komplett kopiert werden macht mein Programm nahezu nur noch Speicherumkopieroperationen - wo ein weiterreichen des Pointers vollkommen reichen würde.
    Einzige Lösung die mir jetzt noch einviele wären eindimensionale C-Arrays die ich wie 2 dimensionale behandle. Dann müsste ich aber mein Programm wieder komplett umschrieben - Es sei denn diese swap Funktion wäre schnell. Hat aber auch den Nachteil das dann das erste Array unsinnige Werte enthält und ich damit auf ein Rückübergabe des zweiten Arrays an das erste angewiesen bin.

    Matthias

    PS: Der Beitrag hätte eigentlich ins C++ Forum gesollt.



  • std::vector::swap ist als "constant time" eingestuft:
    Complexity ... allerdings weiß ich nicht warum du die Elemente "austauschen" willst ...
    std::copy wäre doch viel eher was für dich!



  • (D)Evil schrieb:

    allerdings weiß ich nicht warum du die Elemente "austauschen" willst ...

    Will ich nicht, aber nach http://www.cplusplus.com/reference/stl/vector/swap.html
    passiert genau dass. Wollen tue ich das nicht. Wenn es aber so extrem schnell sein soll könnte es eine Option sein.

    (D)Evil schrieb:

    std::copy wäre doch viel eher was für dich!

    Wenn es schneller ist als ein

    m_ArrayTwo = m_ArrayOne;
    

    dann ja.

    Jetzt stellt sich mir zusätzlich die Frage mit welcher Geschwindigkeit eine Operation der Art:

    vector<vector<CComplex> > Laserbeam::GetArray()
    {
    	return m_Array;
    }
    
    Laserbeam InputBeam;
    m_LaserBeamArray = InputBeam.GetArray();
    

    abläuft. Denn wie ich damit ein swap machen sollte ist mir nicht klar.

    Matthias


Anmelden zum Antworten