如何创建一个动态整数数组


84

如何使用new关键字在C ++中创建动态整数数组?


11
您使用std::vector<int>。还有一本书
GManNickG

初始化后如何分配和访问其数据?

看看这篇文章,这里为每种数据类型提供了详细信息:programmingtunes.com/dynamic-array-in-c
user2808359 2014年


quora.com/什么是%E2%80%9Cint- * -p-new-10-%E2%80%9D#:〜:text =%20语句%20定义%20和%20初始化, of%20an%20array%20of%20integers。&text =%20statement%20will%20dynamic%20allocate,integers%20from%20the%20heap ...
Nagappa

Answers:


127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

不要忘记为delete您分配的每个数组new


27
我不会-1,但如果您甚至可能忘记了delete,您的代码是错误的。
GManNickG

2
8年后,该注释可能会使初学者@GManNickG感到困惑,如何删除它(因为我想它是在Jason Iverson实际删除数组之前完成的)?
gsamaras

2
@gsamaras:我同意这令人困惑,但它仍然是正确的:您的代码不应手动删除,您必须记住不要忘记。也就是说,使用了智能指针和其他容器。
GManNickG '18 -10-6

@GManNickG我认为您的评论可能不会那么教条。该代码是正确的,即使它不是理想的。智能指针和容器几乎总是一个更好的选择(尤其是在这样的初学者问题中),但并非总是“总是”。
Spencer

63

从C ++ 11开始,有一种安全的替代方法,new[]delete[]零开销不同,它是std::vector

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

在C ++ 14中:

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

以上两个都依赖于相同的头文件, #include <memory>


我不知道是否只有我一个人,但是C ++ 11语法看起来很糟糕。C ++ 14看起来更好。再说一次,自C ++ 11之前,我就没有跟上。记住所有这些新表达很难。
Keya Kersting

28

您可能要考虑使用标准模板库。它简单易用,而且您不必担心内存分配。

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
好的,但是回答实际问题也很好。
Ed S. 2010年

8
@Ed,问题中的限制似乎相当武断。std::vector使用适当的构造函数的效果很好,应该指出这一点。有时人们问的问题很不好,这可能是其中一种情况-它很简短,没有给出任何偏爱的理由new
Mark Ransom

3
@Ed:没有理由使用new[]代替std::vector
GManNickG

2
@baash:在C ++中,没有任何原因。如果出于某种原因决定“删除标准库”,那么您将不再使用C ++进行编程。我的评论是针对C ++语言的,而不是针对我们在我的设备上使用的C ++语言的。即使这样,您也永远不需要delete手动进行任何操作。另外,它std::vector是一个动态数组,对链接列表不起作用。它只是一块内存的包装。
GManNickG

1
@Montdidier:不。您仍然使用newdelete实现包装器。关键是您不管理资源而是使用资源而是一个或另一个。
GManNickG

6
int* array = new int[size];

2
它只是回答了这个问题。
Ed S. 2010年

@GManNickG因为矢量可以更方便或其他原因?因为我经常遇到需要使用数组而不是向量的第三方函数。
冒犯君主

5
@Lèsemajesté没有理由不使用向量-std::vector::data()成员函数将在需要时返回基础原始数组。
emlai

3
@zenith:通常,您将使用向量operator&而不是data()从向量中获取指针,但是的确,向量提供了与期望数组的功能兼容所需的连续性保证。
Ben Voigt 2015年

3

一旦对动态数组提出疑问,您可能不仅希望创建具有可变大小的数组,而且还希望在运行时更改它的大小。这是带有的示例memcpy,您也可以使用memcpy_sstd::copy。取决于编译器,<memory.h>或者<string.h>可能是必需的。使用此功能时,您将分配新的存储区,将原始存储区的值复制到该存储区,然后释放它们。

//    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;

您可以使用常数4代替sizeof(int)


1

使用new以下命令动态分配一些内存:

int* array = new int[SIZE];

2
您可能错过了冒号,或者未将SIZE替换为实际大小。
蒙迪迪耶

5
为什么要使用分号?这不是一个完整的声明。可能会有更多的声明。如果包含在完整程序中,这将执行OP的要求。
本杰明·林德利

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;
}

上面的代码有效,可以定义的最大float或int数组大小为2095879,并且退出条件为非零起始输入数字

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.