如何使用 int 0 和 '' 的 c++ 数组

How do I use a c++ array with int 0 and ''

本文关键字:c++ 数组 何使用 int      更新时间:2023-10-16

我使用的是一个c++整数数组(int*)。我已经生成了数字集,并将其放入这个数组中,例如1, 0, 3, 4, 5。此方法为数组分配了16个字符

int *arr = (int *)malloc(16). 

我需要能够循环通过这个数组,使用每个数字并告诉数组中有多少数字。为了循环遍历数组中的每个元素,我尝试了两种方法:

for(int i=0;i<sizeof(arr);i++) and for(int i=0;arr[i]!='';i++). 

第一个方法的问题是sizeof返回16,因为这就是我为该数组分配的空间。除非序列中存在0,否则第二种方法是成功的。我应该如何循环遍历数组中的每个元素,而不陷入0或循环遍历所有16插槽?

由于您对这个"数组"(内存块)使用了动态分配,所以类型系统不知道数组的维度。这意味着您不能使用sizeof(arr)。你在那里所做的就是找到你的int*(一个指针)的大小。

而且,正如您所发现的那样,尝试空终止这个数组是完全愚蠢的,因为0是一个完全有效、合理的整数值。

应该执行以下操作之一:

选项1

const unsigned int LENGTH = 16;
int* ptr = new int[LENGTH];     // (malloc is an ancient approach from C)
for (unsigned int i = 0; i < LENGTH; i++) {
// ...
}
delete[] ptr;
// here, I've remembered the block's size myself

选项2

std::vector<int> vec(16);
for (auto myInt : vec) {
// ...
}
// here, the wrapper called "vector" knows its own size

选项2a

如果您只是任意选择16来提供最大上限,并且您并不总是需要16个元素:

std::vector<int> vec;   // this grows as needed
vec.push_back(1);
vec.push_back(0);
vec.push_back(3);
for (auto myInt : vec) {
// ...
}

选项3

如果值16不依赖于用户输入或其他运行时数据,则忽略动态分配:

std::array<int, 16> arr;
for (auto myInt : arr) {
// ...
}

或者,去老派:

int arr[16];
for (auto myInt : arr) {
// ...
}

结论

很难说你想做什么,但我认为你想拥有一堆数组元素,并不是所有的元素都可以在任何时候"使用",并以某种方式标记"未使用"的元素。在这种情况下,您希望放弃老式的逻辑,并使用上面的选项2a

Bootnote

我在这里使用了一些C++11构造,即std::array和ranged for循环。根据需要,将循环替换为更传统的等效循环。

sizeof返回以字节为单位的类型大小,而不是数组的长度。因此,要使方法#1工作,您必须存储数组的长度。

您应该使用countof而不是sizeof:

template <typename T, size_t N> size_t countof( T (&array)[N] ){return N;}

我不知道它到底为什么有效(我的意思是,如果我把它弄松了,我不知道该怎么写),但我使用它(我会努力理解它——现在!)

我更了解如何解释的另一种方法是使用CCD_ 16。

尽可能避免使用"特殊情况"值。总是会有问题。

已经有一些非常好的答案了,但我只想添加一个丑陋的答案:

如果你想以的方式写入数组的大小

int *arr = (int*)malloc(16);

大小取决于系统中int的大小,例如每个int可以有4个字节,因此最多可以容纳4个int。为了跟踪您分配的大小,您需要在分配的块中手动输入大小,例如

int n = 4;
int *arr = (int*)malloc((n+1)*sizeof(int)); 
*arr = 4;

然后移动指针

++arr;

无论何时需要尺寸,请检查*(arr-1)

释放区块时,请确保使用free(arr-1)

也许最好用某种功能来包裹它们,以隐藏丑陋。

我真的不建议使用这种方法,因为你是用C++编程的,避免使用malloc/free,因为它们与C++不太兼容,也就是说,它们对构造函数一无所知,而是使用new/new[]/delete/delete[]vector<>也是我最喜欢的模板之一,一旦你知道如何使用数组,那就轻而易举了。