用C++动态设置数组大小

Dynamically Set Array Size C++

本文关键字:数组 设置 C++ 动态      更新时间:2023-10-16

我根本不懂任何C++,但我正在尝试对我的应用程序正在使用的C++库进行一个非常小的更新。在我开始破解之前,我希望有人能告诉我以下内容的正确语法:

我有以下几行代码:

#define A_NUMBER 100
#define ANOTHER_NUMBER 150
enum {
   type1,
   type2,
 };
static int someMethod(int type)
{
     char command[A_NUMBER];
     //...more code
}

我需要能够做的是基于类型参数(类型1或类型2(,我需要能够将数组的大小设置为A_NUMBER或ANOTHER_NUMBER。

在伪代码中,它将类似于:

if (type == type1) {
    char command [A_NUMBER]
}
else if (type == type2) {
    char command [ANOTHER_NUMBER]
} 

有没有一种方法可以动态定义大小?

是的,您可以使用std::vector<char>:

if (type == type1) {
    std::vector<char> x(A_NUMBER);
} else if (type == type2) {
    std::vector<char> x(ANOTHER_NUMBER);
} 

请记住包含标题:

#include <vector>

虽然您的示例代码与问题中的"伪代码"相匹配,但我认为问题的一部分是如何通过类型决定大小,然后无条件地使用结果存储,即在条件块之外。

然后它变得很简单:

std::vector<char> x;
if (type == type1) {
    x.resize(A_NUMBER);
} else if (type == type2) {
    x.resize(ANOTHER_NUMBER);
} 

我相信这就是你想要的

std::vector<char> x; // x is empty, with size 0
if (type == type1) {
    x.resize(A_NUMBER); // change size to A_NUMBER
} else if (type == type2) {
    x.resize(ANOTHER_NUMBER); // change size to ANOTHER_NUMBER
} 

是和否。在标准C++中,不能将数组保留在堆栈上,也不能在运行时确定其大小。

但是,您可以将数组转换为动态分配的数组(即在堆上(。在C++中,标准的方法是使用std::vector:

std::vector<char> command(A_NUMBER); // or ANOTHER_NUMBER

索引将像以前一样工作:command[5]

但是,如果您需要将数组传递给期望C样式数组(即char *(的对象,则必须使用以下方法之一:

command.data();  // if your compiler supports C++11
&command[0];  // if it does not

当然,要使用std::vector,必须使用#include <vector>

下面是一个在C和C++中工作的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
    char *opt;
    if(argc == 2) {
        opt = *++argv;
    }
    else {
        printf("Usage: %s [small|large]n", *argv);
        return EXIT_FAILURE;
    }
    int *arr;
    int arrlen = 0;
    if (strcmp(opt, "small") == 0) {
        arrlen = 3;
        arr = (int *) malloc(arrlen*sizeof(int));
        int i;
        for(i = 0; i < arrlen; i++)
            arr[i] = i+1; 
    }
    else if (strcmp(opt, "large") == 0) {
        arrlen = 5;
        arr = (int *) malloc(arrlen*sizeof(int));
        int i;
        for(i = 0; i < arrlen; i++)
            arr[i] = i+1; 
    }
    if (arrlen > 0) {
        int i;
        for(i = 0; arr[i]; i++)
            printf("%i, ", arr[i]);
        printf("n");
        free(arr);
    }
    return EXIT_SUCCESS;
}

示例:

[gyeh@gyeh stackoverflow]$ ./dynarr
Usage: ./dynarr [small|large]
[gyeh@gyeh stackoverflow]$ ./dynarr small
1, 2, 3, 
[gyeh@gyeh stackoverflow]$ ./dynarr large
1, 2, 3, 4, 5, 

原始C++方式是newdelete

char * command = new char[A_NUMBER];
// and later delete it like this
delete[] command;

当然,你必须管理内存,不建议使用这种方法,因为有很多原因你应该能够在网上找到。所以最后如果矢量是一个选项,则不要使用此方法

如果使用大数组,最好的方法是使用C++vector,您甚至可以根据需要考虑其他数据结构,如list(例如,对数组执行大量插入、删除操作(。