2012-11-26 88 views
6

khác Tôi đã sử dụng mảng để lưu trữ dữ liệu, nhưng tôi đã thay thế bằng vectơ, vì vậy tôi muốn thay thế tất cả các toán tử c bằng toán tử C++. Tôi đã sử dụng memcpy để sao chép một khối bộ nhớLàm cách nào để sao chép một khối vectơ sang

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

Nó cũng hoạt động với vectơ, tôi chỉ muốn biết có chức năng tương đương trong c + + không?

Tôi đã thử các bản sao:

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

nhưng tôi nhận được lỗi sau:

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

Ví dụ:

Tôi có một mảng kích thước 2xnxn và tôi đang sử dụng cho chu kỳ để tạo một mảng nxn thay thế. ví dụ tôi có 1 2 3 4 5 6 7 8, mảng mới của tôi phải như sau: 3 4 7 8. Tôi đã sử dụng memcpy để đạt được điều này, nhưng tôi không biết làm thế nào tôi có thể đạt được trong C++

+2

bạn đã thử ['std :: copy'] (http://www.cplusplus.com/reference/algorithm/copy/) chưa? – WhozCraig

+2

'std :: copy'. Trong thực tế, bạn nên sử dụng nó với mảng là tốt. – Yuushi

+0

Có Tôi đã thử: std :: sao chép (tmp.data_ [cols_ * i], tmp.data_ [cols_ * i + hàng], a.data_ [cols_ * (2 * i + 1)]); –

Trả lời

3

Sử dụng std::copy hoặc std::vector::assign nếu bạn sao chép từ array để 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); 

nếu copy từ vector Vector

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

nếu bạn không cần phải giữ v1, std::swap cũng làm việc

v2.swap(v1); 

Cập nhật:

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

Tôi có mảng kích thước 2xnxn và tôi đang sử dụng chu trình để tạo mảng nxn thay thế. Ví dụ tôi có 1 2 3 4 5 6 7 8, mảng mới của tôi có được như sau: 3 4 7 8. Tôi đã sử dụng memcpy để đạt được điều này, nhưng tôi không biết làm thế nào tôi có thể đạt được trong c + + –

+0

@ iUngi, xem câu trả lời cập nhật của tôi, đó là những gì bạn muốn? – billz

4

Có một thuật toán chuẩn copy. Nó an toàn hơn memcpy vì nó cũng hoạt động cho các loại không phải POD. Nó đôi khi được tối ưu hóa cho các loại POD để dẫn đến memcpy. Bạn thường không sử dụng con trỏ với các thuật toán chuẩn, nhưng bạn phải sử dụng các trình vòng lặp. Để có trình lặp, bạn sử dụng các phương thức begin()end() hoặc các chức năng miễn phí. Ví dụ:

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

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

Ngoài ra còn có 'vector :: assign'. –

3

Vâng, std::vector có nguồn gốc operator=() mà có thể được sử dụng để sao chép một nội dung vectơ khác:

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

Ngoài ra còn có std::copy mà làm việc với lặp và cho phép để có mảng lát sao chép.

+0

Toán tử =() không tốt cho tôi vì tôi sắp xếp lại khối khối –

+0

Sau đó sử dụng 'std :: copy' – mvp

Các vấn đề liên quan