Thay đổi kích thước trong C ++ là một điều khó khăn vì có thể cần gọi các hàm tạo và hàm hủy.
Tôi không nghĩ rằng có lý do cơ bản tại sao trong C ++ bạn không thể có một resize[]
toán tử để đi cùng new[]
và delete[]
, điều đó đã làm một cái gì đó tương tự như thế này:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Rõ ràng là oldsize
sẽ được truy xuất từ một vị trí bí mật, giống như nó ở trong đó delete[]
, và Type
sẽ đến từ loại toán hạng. resize[]
sẽ không thành công khi Kiểu không thể sao chép - điều này đúng, vì các đối tượng như vậy chỉ đơn giản là không thể di dời được. Cuối cùng, đoạn mã trên mặc định xây dựng các đối tượng trước khi gán chúng, điều mà bạn không muốn là hành vi thực tế.
Có thể có một cách tối ưu hóa, trong đó newsize <= oldsize
, gọi các hàm hủy cho các đối tượng "quá cuối" của mảng mới được tạo và không làm gì khác. Tiêu chuẩn sẽ phải xác định xem liệu tối ưu hóa này là bắt buộc (như khi bạn resize()
là vectơ), được phép nhưng không xác định, được phép nhưng phụ thuộc vào triển khai hoặc bị cấm.
Sau đó, câu hỏi mà bạn nên tự hỏi là, "việc cung cấp điều này có thực sự hữu ích không, vì nó vector
cũng làm được điều đó và được thiết kế đặc biệt để cung cấp một vùng chứa có thể thay đổi kích thước (của bộ nhớ liền kề - yêu cầu đó bị bỏ qua trong C ++ 98 cố định trong C ++ 03) phù hợp hơn mảng với các cách hoạt động của C ++? "
Tôi nghĩ câu trả lời được nhiều người cho là "không". Nếu bạn muốn thực hiện các bộ đệm có thể thay đổi kích thước theo cách C, hãy sử dụng bộ đệm malloc / free / realloc
có sẵn trong C ++. Nếu bạn muốn thực hiện các bộ đệm có thể thay đổi kích thước theo cách C ++, hãy sử dụng một vectơ (hoặc deque
, nếu bạn thực sự không cần bộ nhớ liền kề). Đừng cố kết hợp cả hai bằng cách sử dụng new[]
cho bộ đệm thô, trừ khi bạn đang triển khai một vùng chứa giống như vectơ.