Cách tạo một mảng động các số nguyên


84

Làm thế nào để tạo một mảng động các số nguyên trong C ++ bằng cách sử dụng newtừ khóa?


11
Bạn sử dụng a std::vector<int>. Và một cuốn sách .
GManNickG

làm cách nào để bạn gán và truy cập dữ liệu của nó sau khi nó được khởi tạo?

Có một cái nhìn vào bài đăng này, ở đây nó được đưa ra một cách chi tiết cho tất cả các loại kiểu dữ liệu: programmingtunes.com/dynamic-array-in-c
user2808359


quora.com/What-is-the-metering-of-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: ~: text = The% 20statement% 20defines% 20and% 20initializes, of% 20an% 20array% 20of% 20integers. & text = This% 20statement% 20will% 20dynamally% 20allocate, integer% 20from% 20the% 20heap ...
Nagappa

Câu trả lời:


127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

Đừng quên deletemọi mảng mà bạn phân bổ new.


27
Tôi sẽ không -1, nhưng nếu bạn thậm chí có thể quên delete, thì mã của bạn sai.
GManNickG

2
8 năm sau, nhận xét đó có thể khiến người mới bắt đầu @GManNickG bối rối, vậy còn việc xóa nó đi (vì tôi cho rằng nó được đưa ra trước khi Jason Iverson thực sự xóa mảng)?
gsamaras

2
@gsamaras: Tôi đồng ý là nó khó hiểu nhưng nó vẫn chính xác: mã của bạn không được xóa thủ công mà bạn phải nhớ đừng quên. Đó là, con trỏ thông minh đã sử dụng và các vùng chứa khác.
GManNickG

@GManNickG Tôi nghĩ nhận xét của bạn có thể bớt giáo điều hơn. Mã là chính xác, ngay cả khi nó không phải là lý tưởng. Con trỏ và vùng chứa thông minh hầu như luôn là lựa chọn tốt hơn (đặc biệt là trong câu hỏi dành cho người mới bắt đầu như thế này) nhưng không phải lúc nào cũng "luôn".
Spencer

63

Kể từ C ++ 11, có một lựa chọn an toàn để new[]delete[]đó là zero-overhead không giống như std::vector:

std::unique_ptr<int[]> array(new int[size]);

Trong C ++ 14:

auto array = std::make_unique<int[]>(size);

Cả hai điều trên đều dựa trên cùng một tệp tiêu đề, #include <memory>


Tôi không biết có phải chỉ tôi không nhưng cú pháp C ++ 11 đó trông thật kinh khủng. C ++ 14 có vẻ tốt hơn. Sau đó, một lần nữa tôi đã không theo kịp kể từ trước C ++ 11. Việc ghi nhớ tất cả những biểu hiện mới này thật khó.
Keya Kersting

28

Bạn có thể muốn xem xét việc sử dụng Thư viện Mẫu Chuẩn. Nó đơn giản và dễ sử dụng, ngoài ra bạn không phải lo lắng về việc phân bổ bộ nhớ.

http://www.cplusplus.com/reference/stl/vector/vector/

int size = 5;                    // declare the size of the vector
vector<int> myvector(size, 0);   // create a vector to hold "size" int's
                                 // all initialized to zero
myvector[0] = 1234;              // assign values like a c++ array

18
Ok, nhưng trả lời câu hỏi thực tế cũng tốt.
Ed S.

8
@Ed, hạn chế trong câu hỏi có vẻ khá tùy tiện. std::vectorvới hàm tạo thích hợp hoạt động thực sự tốt và nên được chỉ ra như một giải pháp thay thế. Đôi khi mọi người đặt câu hỏi không tốt và đây có thể được coi là một trong những trường hợp đó - nó rất ngắn gọn và không đưa ra bất kỳ lý do nào cho việc thích hơn new.
Mark Ransom

3
@Ed: Không có lý do gì để sử dụng new[]thay thế std::vector.
GManNickG

2
@baash: Trong C ++, không bao giờ có lý do. Nếu bạn quyết định, vì bất kỳ lý do gì, để "xóa thư viện tiêu chuẩn", bạn sẽ không lập trình bằng C ++ nữa. Nhận xét của tôi dành cho ngôn ngữ C ++, không phải C ++ - ngôn ngữ-chúng tôi-sử dụng-trên-thiết bị của tôi. Mặc dù vậy, bạn không cần phải làm deletebất cứ điều gì theo cách thủ công. Ngoài ra, std::vectorlà một mảng động và không làm gì với danh sách được liên kết. Nó chỉ là một lớp bao bọc xung quanh một đoạn bộ nhớ.
GManNickG

1
@Montdidier: Không. Bạn vẫn sử dụng newdeletetriển khai trình bao bọc. Vấn đề là bạn không quản lý tài nguyên sử dụng nó, bạn làm cái này hay cái khác.
GManNickG

6
int* array = new int[size];

2
Nó chỉ trả lời câu hỏi.
Ed S.

@GManNickG Vì vector có thể thuận tiện hơn hay vì lý do khác? Vì tôi thường gặp các hàm của bên thứ 3 yêu cầu sử dụng mảng thay vì vectơ.
Lèse majesté

5
@ Lèsemajesté Không có lý do gì để không sử dụng vectơ - Hàm std::vector::data()thành viên sẽ trả về mảng thô bên dưới khi cần thiết.
emlai

3
@zenith: Thông thường, bạn sẽ sử dụng operator&thay vì data()lấy một con trỏ từ một vectơ, nhưng đúng là một vectơ cung cấp bảo đảm liên tục cần thiết để tương thích với các hàm mong đợi mảng.
Ben Voigt

3

Ngay khi câu hỏi về mảng động, bạn có thể không chỉ muốn tạo mảng với kích thước thay đổi mà còn thay đổi kích thước của nó trong thời gian chạy. Đây là một ví dụ với memcpy, bạn có thể sử dụng memcpy_shoặc std::copycũng được. Tùy thuộc vào trình biên dịch, <memory.h>hoặc <string.h>có thể được yêu cầu. Khi sử dụng các chức năng này, bạn phân bổ vùng bộ nhớ mới, sao chép các giá trị của vùng bộ nhớ gốc vào nó và sau đó giải phóng chúng.

//    create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];

//   now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];

/*   
somehow set values to given arrays
*/ 

//    add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;

Bạn có thể sử dụng hằng số 4 thay vì sizeof(int).


1

cấp phát động một số bộ nhớ bằng cách sử dụng new:

int* array = new int[SIZE];

2
Có thể bạn đang thiếu dấu hai chấm hoặc chưa thay thế SIZE bằng kích thước thực .
Montdidier

5
Tại sao phải có dấu chấm phẩy? Nó không phải là một tuyên bố hoàn chỉnh. Có thể có nhiều khai báo hơn. Điều này, nếu được bao gồm trong một chương trình hoàn chỉnh, sẽ thực hiện những gì OP yêu cầu.
Benjamin Lindley

0
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{

    float arr[2095879];
    long k,i;
    char ch[100];
    k=0;

    do{
        cin>>ch;
        arr[k]=atof(ch);
        k++;
     }while(ch[0]=='0');

    cout<<"Array output"<<endl;
    for(i=0;i<k;i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

Đoạn mã trên hoạt động, kích thước mảng float hoặc int tối đa có thể được xác định là với kích thước 2095879 và điều kiện thoát sẽ là số đầu vào bắt đầu khác 0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.