2013-03-05 45 views
7
struct sample { 
    int x; 
    int y; 
    int arr[10]; 
}; 

int arr2[10] = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5}; 

int a = 19; 
int b = 22; 
struct sample* samp = new sample; 
samp->x = a; 
samp->y = b; 
samp->arr = ?? 

Trong ví dụ trên, tôi cần phải khởi tạo mảng bên trong cấu trúc arr [10] với các yếu tố của arr2 [10].Khởi tạo một mảng bên trong một cấu trúc từ một mảng trong C++

Cách thực hiện trong C++ ??

+4

Dừng sử dụng mảng thô và bắt đầu sử dụng ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) hoặc [' std :: array'] (http://en.cppreference.com/w/cpp/container/array). –

+0

Chỉ trong trường hợp bạn không thực hiện lời khuyên tiền lệ một cách nghiêm túc. Nếu bạn muốn thực hiện C++, hãy sử dụng std :: vector và các thư viện tiêu chuẩn nói chung. –

+0

thay đổi mẫu ** của bạn -> ** thành ** samp -> **. ** mẫu ** là tên thẻ và không thể được sử dụng như thế. –

Trả lời

3

Cách thực hiện trong C++ ??

Giải pháp đơn giản nhất là sử dụng std::copy như đã được những người khác nói. Do không sử dụng memcpy trong C++, dưới dạng std::copy thực hiện tương tự cho POD nhưng cũng được áp dụng cho các POD không phải và chỉ thực hiện điều đúng. Nếu loại trong mảng của bạn thay đổi một ngày, bạn sẽ phải truy cập lại tất cả các địa điểm nơi bạn thực hiện bản sao đó và thay thế memcpy. (Và bạn sẽ bỏ lỡ một trong các địa điểm và gặp khó khăn khi tìm lỗi). Sử dụng memcpy trong C++ không có lợi ích, vì vậy hãy sử dụng std::copy ngay từ đầu.

Giải pháp tốt hơn là nên sử dụng C++ dữ liệu cấu trúc, trong trường hợp này, sử dụng std::array

#include <array> 
struct sample { 
     int x; 
     int y; 
     std::array<int, 10> arr; //C++ array instead of plain C array 
    }; 

int main() 
{ 
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5}; 

    int a = 19; 
    int b = 22; 

    // 1: no need to say "struct sample*" since C++98 
    // 2: prefer to use smart pointers.. 
    //sample* samp = new sample; 
    std::unique_ptr<sample> samp(new sample()); 
    samp->x = a; 
    samp->y = b; 
    samp->arr = arr2; //it's as easy as it should be! 

    // 3: ... so ypu can't forget to delete! 
    //delete samp; 
} 

Edit: tôi đã sử dụng unique_ptr đây, mặc dù trong ví dụ này ít bạn không cần để sử dụng phân bổ đống. Để đưa vào khởi tạo của Grijesh cũng như:

int main() 
{ 
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5}; 

    int a = 19; 
    int b = 22; 

    sample samp = {a, b, arr2}; //done! 
} 

không phân bổ, dọn dẹp, không cần phân bổ yếu tố khôn ngoan.

+0

ok đây là 'std :: array' tốt :) –

3

bạn có thể sử dụng memcpy:

memcpy(sample->arr,arr2,sizeof(int) * 10) 

Nhưng tôi sẽ đề nghị sử dụng std :: vector cho cả hai.

+5

bạn cần: '10 * sizeof (int)' – hannes

+0

@hannes yes , bạn hoàn toàn chính xác. – Lucian

+1

thích 'std :: copy' hơn 'memcpy', do đó bạn không phải quay lại nếu kiểu thay đổi thành' MyIntType' không phải POD. Và vector là phân bổ động, bạn không cần điều đó nếu bạn biết kích thước và nó không thay đổi - 'std :: array' là vùng chứa tốt hơn cho những trường hợp đó. –

1

Sao chép mảng sử dụng vòng lặp for,

for(int i=0; i<10; i++) { 
    samp->arr[i]=arr2[i]; 
} 
+0

tại sao sử dụng vòng viết tay nếu thuật toán có thể thực hiện điều đó? –

0

Thông thường người ta sẽ sử dụng std::copy (<algorithm>) cho việc này:

std::copy(std::begin(arr2), std::end(arr2), std::begin(samp->arr)); 

Lưu ý rằng std::begin()std::end() (<iterator>) cần hỗ trợ C++ 11. Nếu trình biên dịch của bạn không hỗ trợ C++ 11 bạn có thể cung cấp chức năng này khá dễ dàng cho bản thân hoặc sử dụng arithmetics con trỏ:

std::copy(arr2, arr2 + 10, samp->arr); 

Đó là buồn, bạn nên cố gắng sử dụng std::vector cho mảng động hoặc std::array (C++ 11) cho mảng kích thước cố định.

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