2012-11-26 14 views
6

Ich habe Array verwendet, um die Daten zu speichern, aber ich habe mit Vektor ersetzt, also möchte ich alle c-Operatoren mit C++ - Operatoren ersetzen. Ich benutzen Memcpy einen SpeicherblockWie kann ich einen Vektorblock zum anderen kopieren

for (i = 0; i < rows_; i++) 
    memcpy((T *) &tmp.data_[cols_ * i], (T *) &a.data_[cols_ * (2 * i + 1)], rows_ * sizeof(T)); 

Es ist auch mit Vektoren arbeiten zu kopieren, ich möchte nur wissen, ist es eine entsprechende Funktion in C++?

habe ich versucht, die Kopie:

std::copy(tmp.data_[cols_ * i], tmp.data_[cols_ * i+rows], a.data_[cols_ * (2 * i + 1)]); 

aber Ich erhalte den folgenden Fehler:

error: invalid use of member function (did you forget the ‘()’ ?) 

Zum Beispiel:

ich eine 2xnxn Größe Array haben, und ich bin mit die für Zyklus, um stattdessen ein nxn-Array zu machen. zum Beispiel habe ich 1 2 3 4 5 6 7 8, mein neues Array muss das folgende sein: 3 4 7 8. Ich verwendete memcpy, um dies zu erreichen, aber ich weiß nicht, wie ich in C++

+2

hast du versucht ['std :: copy'] (http://www.cplusplus.com/reference/algorithm/copy/)? – WhozCraig

+2

'std :: kopieren'. In der Tat sollten Sie es auch mit Arrays verwenden. – Yuushi

+0

Ja, ich habe versucht: std :: copy (tmp.data_ [Spalten_ * i], tmp.data_ [Spalten_ * i + Zeilen], a.data_ [Spalten_ * (2 * i + 1)]); –

Antwort

3

Verwenden std::copy oder std::vector::assign, wenn Sie von array kopieren zu vector

int from_array[10] = {1,2,3,4,5,6,7,8,9,10}; 

    std::vector<int> to_vector; 

    int array_len = sizeof(from_array)/sizeof(int); 
    to_vector.reserve(array_len); 
    std::copy(from_array, from_array+10, std::back_inserter(to_vector)); 
    or C++11 
    std::copy(std::begin(from_array), std::end(from_array), std::back_inserter(to_vector)); 

    std::vector<int> to_vector2; 
    to_vector2.reserve(array_len); 
    to_vector2.assign(from_array, from_array + array_len); 

wenn Kopie von Vektor

std::vector<int> v1; 
    std::vector<int> v2; 
    v2 = v1; // assign operator = should work 

Vektor, wenn Sie benötigen v1 nicht zu halten, std::swap funktioniert auch

v2.swap(v1); 

Update:

const int M = 2; 
    const int N = 4; 
    int from_array[M][N] = {{1,2,3,4},{5,6,7,8}}; 

    std::vector<int> to_vector; 
    to_vector.reserve(N); 
    int start=2; 
    int end = 4; 
    for (int i=0; i<M; i++) 
    { 
    std::copy(from_array[i]+start, from_array[i]+end, std::back_inserter(to_vector)); 
    } 
+0

Ich habe eine 2xnxn Größe Array und ich benutze die für Zyklus, um stattdessen eine nxn-Array. zum Beispiel habe ich 1 2 3 4 5 6 7 8, mein neues Array muss das folgende sein: 3 4 7 8. Ich habe memcpy verwendet, um dies zu erreichen, aber ich weiß nicht, wie ich in C++ erreichen kann –

+0

@iUngi, Siehe meine aktualisierte Antwort, ist das was du willst? – billz

4

erreichen kann Es gibt einen Standardalgorithmus copy. Es ist sicherer als memcpy, da es auch für Nicht-POD-Typen funktioniert. Es ist manchmal optimiert für POD-Typen, um in memcpy zu resultieren. Normalerweise verwenden Sie keine Zeiger mit Standardalgorithmen, aber Sie müssen Iteratoren verwenden. Um einen Iterator zu erhalten, verwenden Sie begin() und end() Methoden oder freie Funktionen. Beispiel:

vector<int> a(10, 5); 
vector<int> b(5); 

copy(a.begin(), a.begin()+5, b.begin()); 
+1

Es gibt auch 'vector :: assign'. –

3

Nun hat std::vector nativen operator=(), die zum Kopieren eines Vektors Inhalt zu einem anderen verwendet werden können:

std::vector<T> x; 
std::vector<T> y; 
y = x; 

Es gibt auch std::copy ist, die mit Iteratoren arbeitet und ermöglicht kopiert Array Scheiben zu haben.

+0

Der Operator =() ist nicht gut für mich, weil ich die Array-Blöcke reorganisieren –

+0

Dann verwenden Sie 'std :: copy' – mvp

Verwandte Themen