2010-09-20 124 views

Trả lời

28

Kích thước của mảng là tĩnh trong C++. Bạn không thể thay đổi kích thước động nó. Đó là những gì std::vector dành cho:

std::vector<int> v; // size of the vector starts at 0 

v.push_back(10); // v now has 1 element 
v.push_back(20); // v now has 2 elements 
v.push_back(30); // v now has 3 elements 

v.pop_back(); // removes the 30 and resizes v to 2 

v.resize(v.size() - 1); // resizes v to 1 
+9

Tôi sẽ thay thế 'v.resize (v.size() - 1)' với 'v.pop_back()' ... – fredoverflow

+0

BTW, không phải mảng trong C# cũng là tĩnh? – ironic

+4

@FredOverflow: Vâng, đó là một khả năng. Tuy nhiên, tôi đã cố gắng gắn bó với mã được đưa ra trong câu hỏi. Tôi cho rằng 'size-1' chỉ là một trình giữ chỗ. – sbi

1

Mảng thô không thể thay đổi kích thước trong C++.

Bạn nên sử dụng một cái gì đó giống như một lớp Vector mà không cho phép thay đổi kích thước ..

std::vector cho phép bạn thay đổi kích thước cũng như cho phép thay đổi kích thước động khi bạn thêm các yếu tố (thường làm cho thay đổi kích thước của nhãn hiệu không cần thiết cho việc thêm).

-1

Bạn không thể làm điều đó, xem this question 's câu trả lời. Bạn có thể sử dụng std: vector thay thế.

27

Bạn không thể thay đổi kích cỡ mảng, bạn chỉ có thể cấp phát mảng mới (có kích thước lớn hơn) và sao chép nội dung của mảng cũ. Nếu bạn không muốn sử dụng std::vector (đối với một số lý do) đây là đoạn code để nó:

int size = 10; 
int* arr = new int[size]; 

void resize() { 
    size_t newSize = size * 2; 
    int* newArr = new int[newSize]; 

    memcpy(newArr, arr, size * sizeof(int)); 

    size = newSize; 
    delete [] arr; 
    arr = newArr; 
} 

code đang từ đây http://www.cplusplus.com/forum/general/11111/.

+13

Và điều gì sẽ xảy ra khi giữa 'mới' và' xóa', một ngoại lệ được ném ra? '-1' _for đề xuất quản lý tài nguyên thủ công cho newbie_. (Nếu bạn muốn làm điều này an toàn, bạn sẽ cần một con trỏ thông minh. Nếu bạn thêm một vài chức năng tiện ích, bạn sẽ đến 'std :: vector'.) – sbi

+6

Cảm ơn vì -1 :) Tôi đang đề xuất người mới để hiểu rằng ** không có ma thuật xảy ra trong khi thay đổi kích thước mảng **, mảng mới được tạo và tất cả các phần tử được sao chép và nếu bạn viết mã thay đổi kích thước mảng 1 mỗi lần bạn cần thêm phần tử, thì bạn sẽ lãng phí tài nguyên. –

+1

Nếu ngoại lệ sẽ được ném giữa 'new' và' delete', điều này có nghĩa là bạn đang gặp rắc rối thực sự và bạn không thể thực hiện bất cứ điều gì trong hàm 'resize', bạn không nên bắt ngoại lệ ở đó một thông tin) và để người gọi xử lý nó. –

2
  1. Sử dụng std::vector hoặc
  2. Viết phương pháp riêng của mình. Phân bổ bộ nhớ bằng cách sử dụng mới. với bộ nhớ đó, bạn có thể mở rộng đến giới hạn của bộ nhớ.
Các vấn đề liên quan