Phân bổ động trong C ++ với ví dụ

Mảng động là gì?

Một mảng động khá giống với một mảng thông thường, nhưng kích thước của nó có thể thay đổi được trong thời gian chạy chương trình. Các phần tử DynamArray chiếm một khối bộ nhớ liền kề.

Khi một mảng đã được tạo, không thể thay đổi kích thước của nó. Tuy nhiên, một mảng động thì khác. Một mảng động có thể mở rộng kích thước của nó ngay cả sau khi nó đã được lấp đầy.

Trong quá trình tạo một mảng, nó được cấp phát một lượng bộ nhớ xác định trước. Đây không phải là trường hợp của một mảng động vì nó tăng kích thước bộ nhớ của nó theo một yếu tố nhất định khi có nhu cầu.

Trong hướng dẫn C ++ này, bạn sẽ học

Các yếu tố ảnh hưởng đến hiệu suất của Mảng động

Kích thước ban đầu của mảng và hệ số tăng trưởng của nó quyết định hiệu suất của nó. Lưu ý những điểm sau:

  1. Nếu một mảng có kích thước nhỏ và hệ số tăng trưởng nhỏ, nó sẽ tiếp tục phân bổ lại bộ nhớ thường xuyên hơn. Điều này sẽ làm giảm hiệu suất của mảng.
  2. Nếu một mảng có kích thước lớn và hệ số tăng trưởng lớn, nó sẽ có một phần lớn bộ nhớ không sử dụng. Do đó, các thao tác thay đổi kích thước có thể mất nhiều thời gian hơn. Điều này sẽ làm giảm hiệu suất của mảng.

Từ khoá mới

Trong C ++, chúng ta có thể tạo một mảng động bằng cách sử dụng từ khóa mới. Số lượng mục sẽ được phân bổ được chỉ định trong một cặp dấu ngoặc vuông. Tên loại phải đứng trước tên này. Số lượng mặt hàng được yêu cầu sẽ được phân bổ.

Cú pháp:

Từ khóa mới có cú pháp sau:

 pointer_variable = new data_type; 

Pointer_variable là tên của biến con trỏ.

Kiểu_dữ_liệu phải là kiểu dữ liệu C ++ hợp lệ.

Sau đó, từ khóa trả về một con trỏ đến mục đầu tiên. Sau khi tạo mảng động, chúng ta có thể xóa nó bằng cách sử dụng từ khóa delete.

Ví dụ 1:

 #include using namespace std; int main() { int x, n; cout << 'Enter the number of items:' <>n; int *arr = new int(n); cout << 'Enter ' << n << ' items' << endl; for (x = 0; x> arr[x]; } cout << 'You entered: '; for (x = 0; x < n; x++) { cout << arr[x] << ' '; } return 0; } 

Đầu ra:

Đây là ảnh chụp màn hình của mã:

Giải thích mã:

  1. Đưa tệp tiêu đề iostream vào chương trình của chúng tôi để sử dụng các chức năng của nó.
  2. Bao gồm không gian tên std trong chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
  3. Gọi hàm main (). Logic chương trình nên được thêm vào trong phần thân của hàm.
  4. Khai báo hai biến số nguyên x và n.
  5. In một số văn bản trên bảng điều khiển nhắc người dùng nhập giá trị của biến n.
  6. Đọc đầu vào của người dùng từ bàn phím và gán nó cho biến n.
  7. Khai báo một mảng chứa tổng n số nguyên và gán nó cho biến con trỏ * arr.
  8. In thông báo nhắc người dùng nhập n số mục.
  9. Sử dụng vòng lặp for để tạo biến vòng lặp x để lặp lại các mục do người dùng nhập vào.
  10. Đọc các phần tử được nhập bởi người dùng và lưu trữ chúng trong mảng arr.
  11. Cuối phần thân của vòng lặp for.
  12. In một số văn bản trên bảng điều khiển.
  13. Sử dụng vòng lặp for để tạo biến vòng lặp x để lặp qua các mục của mảng.
  14. In ra các giá trị có trong mảng có tên arr trên bảng điều khiển.
  15. Cuối phần thân của vòng lặp for.
  16. Chương trình phải trả về giá trị khi hoàn thành thành công.
  17. Cuối phần thân của hàm main ().

LƯU Ý: Trong ví dụ trên, người dùng được phép chỉ định bất kỳ kích thước nào cho mảng trong thời gian chạy. Điều này có nghĩa là kích thước của mảng được xác định trong thời gian chạy .

Khởi tạo mảng được cấp phát động

Thật dễ dàng để khởi tạo một mảng động thành 0.

Cú pháp:

 int *array{ new int[length]{} }; 

Trong cú pháp trên, độ dài biểu thị số phần tử được thêm vào mảng. Vì chúng ta cần khởi tạo mảng bằng 0, nên để trống mảng này.

Chúng ta có thể khởi tạo một mảng động bằng cách sử dụng danh sách bộ khởi tạo. Hãy tạo một ví dụ minh họa điều này.

Ví dụ 2:

 #include using namespace std; int main(void) { int x; int *array{ new int[5]{ 10, 7, 15, 3, 11 } }; cout << 'Array elements: ' << endl; for (x = 0; x < 5; x++) { cout << array[x] << endl; } return 0; } 

Đầu ra:

Đây là ảnh chụp màn hình của mã:

Giải thích mã:

  1. Đưa tệp tiêu đề iostream vào chương trình của chúng tôi để sử dụng các chức năng của nó.
  2. Bao gồm không gian tên std trong chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
  3. Gọi hàm main (). Logic chương trình nên được thêm vào trong phần thân của hàm.
  4. Khai báo một biến số nguyên có tên là x.
  5. Khai báo một mảng động có tên là mảng bằng cách sử dụng danh sách bộ khởi tạo. Mảng sẽ chứa 5 phần tử nguyên. Lưu ý rằng chúng tôi đã không sử dụng toán tử '=' giữa độ dài mảng và danh sách trình khởi tạo.
  6. In một số văn bản trên bảng điều khiển. Endl là một từ khóa C ++ có nghĩa là dòng kết thúc. Nó di chuyển con trỏ đến câu tiếp theo.
  7. Sử dụng vòng lặp for để lặp lại các phần tử của mảng.
  8. In nội dung của mảng có tên mảng trên bảng điều khiển.
  9. Cuối phần thân của vòng lặp for.
  10. Chương trình phải trả về giá trị khi hoàn thành thành công.
  11. Cuối phần thân của hàm main ().

Thay đổi kích thước Mảng

Độ dài của một mảng động được đặt trong thời gian cấp phát.

Tuy nhiên, C ++ không có sẵn cơ chế thay đổi kích thước một mảng sau khi nó đã được cấp phát.

Tuy nhiên, bạn có thể vượt qua thử thách này bằng cách phân bổ động một mảng mới, sao chép qua các phần tử, sau đó xóa mảng cũ.

Lưu ý: kỹ thuật này dễ xảy ra sai sót, do đó, hãy cố gắng tránh nó.

Tự động xóa mảng

Một mảng động sẽ được xóa khỏi bộ nhớ máy tính sau khi mục đích của nó được hoàn thành. Câu lệnh xóa có thể giúp bạn thực hiện điều này. Sau đó, không gian bộ nhớ được giải phóng có thể được sử dụng để chứa một bộ dữ liệu khác. Tuy nhiên, ngay cả khi bạn không xóa mảng động khỏi bộ nhớ máy tính, nó sẽ tự động bị xóa khi chương trình kết thúc.

Ghi chú:

Để xóa một mảng động khỏi bộ nhớ máy tính, bạn nên sử dụng xóa [], thay vì xóa. [] Hướng dẫn CPU xóa nhiều biến thay vì một biến. Việc sử dụng delete thay vì delete [] khi xử lý một mảng động có thể dẫn đến sự cố. Ví dụ về các vấn đề như vậy bao gồm rò rỉ bộ nhớ, hỏng dữ liệu, treo máy, v.v.

Ví dụ 3:

 #include using namespace std; int main() { int x, n; cout << 'How many numbers will you type?' <>n; int *arr = new int(n); cout << 'Enter ' << n << ' numbers' << endl; for (x = 0; x> arr[x]; } cout << 'You typed: '; for (x = 0; x < n; x++) { cout << arr[x] << ' '; } cout << endl; delete [] arr; return 0; } 

Đầu ra:

Đây là ảnh chụp màn hình của mã:

Giải thích mã:

  1. Bao gồm tệp tiêu đề iostream trong chương trình của chúng tôi để sử dụng các chức năng của nó.
  2. Bao gồm không gian tên std trong chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
  3. Gọi hàm main (). Logic chương trình nên được thêm vào trong phần thân của hàm.
  4. Khai báo hai biến x và n kiểu dữ liệu số nguyên.
  5. In một số văn bản trên bảng điều khiển. Văn bản sẽ yêu cầu người dùng nêu số lượng số họ sẽ nhập.
  6. Đọc thông tin nhập của người dùng từ bàn phím. Giá trị đầu vào sẽ được gán cho biến n.
  7. Khai báo một biến con trỏ * arr. Mảng arr sẽ dành một số bộ nhớ để lưu tổng cộng n số nguyên.
  8. In thông báo trên bảng điều khiển nhắc người dùng nhập n số.
  9. Tạo vòng lặp for và biến vòng lặp x để lặp lại các số do người dùng nhập vào.
  10. Đọc các số được nhập bởi người dùng và lưu trữ chúng trong mảng arr.
  11. Cuối phần thân của vòng lặp for.
  12. In một số văn bản trên bảng điều khiển.
  13. Sử dụng vòng lặp for và biến vòng lặp x để lặp lại nội dung của mảng arr.
  14. In ra các giá trị của mảng arr trên bảng điều khiển.
  15. Cuối phần thân của vòng lặp for.
  16. In một dòng trống trên bảng điều khiển.
  17. Giải phóng bộ nhớ của mảng arr.
  18. Chương trình sẽ trả về giá trị khi nó hoàn tất thành công.
  19. Cuối phần thân của hàm main ().

Tóm lược:

  • Mảng thông thường có kích thước cố định. Bạn không thể sửa đổi kích thước của chúng khi đã khai báo.
  • Với các loại mảng này, kích thước bộ nhớ được xác định trong thời gian biên dịch.
  • Mảng động là khác nhau. Kích thước của chúng có thể được thay đổi trong thời gian chạy.
  • Trong mảng động, kích thước được xác định trong thời gian chạy.
  • Mảng động trong C ++ được khai báo bằng từ khóa new.
  • Chúng tôi sử dụng dấu ngoặc vuông để chỉ định số lượng mục sẽ được lưu trữ trong mảng động.
  • Sau khi thực hiện xong với mảng, chúng ta có thể giải phóng bộ nhớ bằng cách sử dụng toán tử xóa.
  • Sử dụng toán tử xóa với [] để giải phóng bộ nhớ của tất cả các phần tử mảng.
  • Việc xóa không có [] sẽ giải phóng bộ nhớ của chỉ một phần tử duy nhất.
  • Không có cơ chế tích hợp để thay đổi kích thước mảng C ++.
  • Để khởi tạo mảng bằng trình khởi tạo danh sách, chúng ta không sử dụng toán tử '='.