用C++动态设置数组大小
Dynamically Set Array Size C++
我根本不懂任何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++方式是new
和delete
char * command = new char[A_NUMBER];
// and later delete it like this
delete[] command;
当然,你必须管理内存,不建议使用这种方法,因为有很多原因你应该能够在网上找到。所以最后如果矢量是一个选项,则不要使用此方法
如果使用大数组,最好的方法是使用C++vector
,您甚至可以根据需要考虑其他数据结构,如list
(例如,对数组执行大量插入、删除操作(。
相关文章:
- 我如何处理有关输入的字符串大小超过字符数组设置大小的错误?
- 将字符数组设置为彼此相等的方法不起作用
- 将数组设置在一个对象中,等于另一个对象中的数组
- C++ |如何将整个 2d 数组设置为 O
- 将 2D 数组设置为函数,并根据需要在其他地方调用它
- 使用C 11将数组设置为零
- 将数组设置为包含字符串值会导致错误
- 将数字动态数组设置为数组或容器 c++
- 将对象的数组设置为c 中的null
- 在此初始值设定项方法上将整个数组设置为 NULL 是否C++标准?
- 将结构中的字符串数组设置为函数中的us
- C++如何将整个字符数组设置为空格
- 使用 *指针数组C++设置构造函数和析构函数
- 如何将可变大小的静态数组设置为用 0 填充
- 将double-all的二维数组设置为-1的最快方法
- 使用memset将字符串数组设置为0后,该数组不可用
- 在C++中将多维数组设置为向量
- 将浮点数数组设置为相同值的最快方法
- 为什么使用 'new' 创建的数组设置为 NULL?
- c++使用数组设置交集和并集