Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义数组,然后更改其大小 我来自java后台,我可以用java做一些我需要做的C++,但是我不知道怎么做。_C++_Arrays - Fatal编程技术网

定义数组,然后更改其大小 我来自java后台,我可以用java做一些我需要做的C++,但是我不知道怎么做。

定义数组,然后更改其大小 我来自java后台,我可以用java做一些我需要做的C++,但是我不知道怎么做。,c++,arrays,C++,Arrays,我需要声明一个数组,但目前我不知道数组的大小。一旦知道了大小,就设置数组的大小。我会做一些类似的事情: int [] array; 然后 我如何在C++中执行?声明指针: int * array; 在大多数情况下,您希望使用std::vector std::vector<int> array; array.resize(someSize); 没有C++运行时默认为垃圾回收,因此需要删除[]/COM>避免内存泄漏。你可以用智能指针类型获得两个世界最好的,但实际上,只使用 STD

我需要声明一个数组,但目前我不知道数组的大小。一旦知道了大小,就设置数组的大小。我会做一些类似的事情:

int [] array;
然后

我如何在C++中执行?

声明指针:

int * array;

在大多数情况下,您希望使用
std::vector

std::vector<int> array;

array.resize(someSize);
<>没有C++运行时默认为垃圾回收,因此需要<代码>删除[]/COM>避免内存泄漏。你可以用智能指针类型获得两个世界最好的,但实际上,只使用<代码> STD::向量< /> > .< /P> < P> C++,你可以做:

int *array; // declare a pointer of type int.
array = new int[someSize]; // dynamically allocate memory using new
一旦使用完内存,请使用delete as取消分配内存:

delete[]array;

最好的方法是使用
std::vector
。它做你想做的一切,并且易于使用和学习。此外,由于这是C++,所以应该使用<代码>向量而不是数组。对于为什么应该使用容器类(向量)而不是数组,这是一个很好的理由

向量的大小是动态的,可以根据您的需要而增长-这正是您想要的

确切答案是:

char * array = new char[64]; // 64-byte array

// New array
delete[] array;
array = new char[64];

然而,在大多数情况下,std::vector是一个更好的选择。它不需要手动删除和新命令即可完成所需操作。

正如其他人所提到的,
std::vector
通常是一种方法。原因是vector非常容易理解,它在编译器和平台之间是标准化的,最重要的是,它使程序员免受手动管理内存的困难。此外,需要按顺序分配向量元素(即,向量元素A、B、C将以与推入向量相同的顺序出现在连续存储器中)。这将使向量与常规动态分配数组一样对缓存友好

虽然通过声明指向int的指针并手动管理内存肯定可以实现相同的最终结果,但这将意味着额外的工作:

  • 每次需要更多内存时,都必须手动分配
  • 在为指针指定新值之前,必须非常小心地删除以前分配的内存,以免陷入巨大的内存泄漏
  • 与std::vector不同,这种方法不友好。考虑下面的例子:

    void function()
    {
        int* array = new int[32];
        char* somethingElse = new char[10];
        // Do something useful.... No returns here, just one code path.
        delete[] array;
        delete[] somethingElse;
    }
    

  • 看起来很安全。但事实并非如此。如果在尝试为“somethingElse”分配10个字节时,系统内存不足怎么办?将抛出类型为
    std::bad_alloc
    的异常,该异常将开始展开堆栈以查找异常处理程序,并跳过函数末尾的delete语句。你有内存泄漏。这是避免在C++中手动管理内存的一个原因。为了解决这个问题(如果您真的非常想),该库提供了一系列漂亮的RAII包装器,例如and。

    在编译时知道大小时使用std::array,否则使用std::vector

    #include <array>
    constexpr int someSize = 10;
    std::array<int, someSize> array;
    
    #包括
    constexpr int someSize=10;
    std::数组;
    

    #包括
    std::矢量阵列//大小=0
    array.resize(someSize)//大小
    
    如果没有相当多的额外上下文,这不是一个非常有用的建议。这将是C语言的正确答案,但是C++中,如果你有一个不使用<代码> STD::向量或的坚实理由,那么只使用指针,我假定不使用<代码> java .UTIL .vector >代码的坚实原因将成为不使用<代码> STD::向量< /代码>的坚实理由。我现在正在尝试一个简单的答案。让我们看看它是如何运行的。@ AIB:不使用<代码> java .UTI.Vector 的简单原因将是C++问题的简单原因。java是C++的,蒲公英是分号的。“我来自java背景,我可以用java做一些我需要做C++的事情,但是我不知道怎么做……我想,java我会做一些类似的事情……”令人惊讶的是,izens和我们一样表现良好+1.C++的
    std::vector
    与Java的
    Java.util.ArrayList
    有很多共同之处。(也有不同之处,但相似性很强)这是正确的和有洞察力的,但实际上,应该鼓励在C++中使用<代码> STD::向量< /代码>。这就是容器的用途,从标准容器与RAII的良好配合等明显优势可以看出,在皮肤下
    std::vector
    将此代码逐字节放入其中。通常,不使用标准容器的原因与模板的可用性、给定的非标准编译器等有关。我不会反对这个答案,不是因为它是错误的,而是因为它隐藏了许多重要的、相关的信息,你应该时刻注意这些信息否则你会泄漏内存,这很危险。你只是还不知道大小,还是只有在运行时读了一些东西后才知道大小?即大小是否为编译时常量?在这种情况下,有比使用新的或向量更简单的方法来解决这个问题。从你接受的答案来看,你似乎认为
    std::vector
    不适合你。为什么呢?
    void function()
    {
        int* array = new int[32];
        char* somethingElse = new char[10];
        // Do something useful.... No returns here, just one code path.
        delete[] array;
        delete[] somethingElse;
    }
    
    #include <array>
    constexpr int someSize = 10;
    std::array<int, someSize> array;
    
    #include <vector>
    std::vector<int> array;  //size = 0
    array.resize(someSize);  //size = someSize