C ++如何确定元素是否存在于动态分配的数组中
C++ How to determine if element is present in a dynamic allocated array
假设我有一个动态分配的数组,容量为 50。
int *myArray = new int[50];
我需要编写一个 calAverage 函数来计算该数组内元素的平均值。
并非所有索引都已赋值。 myArray 可能有 0、10 或 50 个值 assigned.I 不知道有多少或在哪里分配了值。
所以这是我的 calAverage 函数:
int calAverage()
{int sum = 0;
int avg = 0;
for (int i=0;i<50;i++)
{
if (element i is present) {sum+=myArray[i];i++}
}
我走在正确的轨道上吗?请帮我完成 calAverage 函数。
我不能使用矢量或地图,因为这是一项作业,这是不允许的。
我收到的提示是创建一个并行数组并比较两者以检查是否分配了一个元素。 IDK 如何提供帮助的逻辑。
Not all index have been assigned a value
事实上,其中一些在某些情况下,如果未初始化或分配,可能会有一个 "unspecified value"(并且读取该值的程序将具有未定义的行为)。
因此,我们可以说这些元素 "haven't been assigned a value"。但我不会那样做,原因有二:
- 你无法检测到这一点,并且
- 不代表元素不存在
这与您想象的 "haven't been assigned a value" 不太一样。所以,我建议你这样想:所有数组元素都存在,总是。您可以使用其他容器来按需添加元素,或者选择您自己的方式来指定值当前是否为您的算法"valid"。
如果您想要一个 x→y 映射列表,其中 x 不连续,也许您应该考虑 std::map
相反(虽然这确实带来了它自己的问题,即它可能会更慢)。或者,如果这些值永远不会被视为 "real" 值,您可以使用某种标记值,例如 -1
。
正如 Lightness 的评论和回答所写,您无法真正检查元素是否已被赋值。但是,您确实说过可以使用并行阵列来帮助您。如果您改用 int 会怎样?当您向数组添加值时,递增与数组一起传递的计数器。然后该计数器将保存数组已使用部分的 'length'。可能不理想,但它会起作用。像这样:
#include <iostream>
double calAverage(int*, int);
int main()
{
int *myArray = new int[50];
int myArrLength = 0;
double avg;
// add values to array
for (int i = 0, add = 5; add > i; i++)
{
myArray[i] = i;
myArrLength++;
}
avg = calAverage(myArray, myArrLength);
return 0;
}
double calAverage(int *arr, int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
sum += arr[i];
}
return sum / static_cast<double>(len);
}
假设我有一个动态分配的数组,容量为 50。
int *myArray = new int[50];
我需要编写一个 calAverage 函数来计算该数组内元素的平均值。
并非所有索引都已赋值。 myArray 可能有 0、10 或 50 个值 assigned.I 不知道有多少或在哪里分配了值。
所以这是我的 calAverage 函数:
int calAverage()
{int sum = 0;
int avg = 0;
for (int i=0;i<50;i++)
{
if (element i is present) {sum+=myArray[i];i++}
}
我走在正确的轨道上吗?请帮我完成 calAverage 函数。
我不能使用矢量或地图,因为这是一项作业,这是不允许的。 我收到的提示是创建一个并行数组并比较两者以检查是否分配了一个元素。 IDK 如何提供帮助的逻辑。
Not all index have been assigned a value
事实上,其中一些在某些情况下,如果未初始化或分配,可能会有一个 "unspecified value"(并且读取该值的程序将具有未定义的行为)。
因此,我们可以说这些元素 "haven't been assigned a value"。但我不会那样做,原因有二:
- 你无法检测到这一点,并且
- 不代表元素不存在
这与您想象的 "haven't been assigned a value" 不太一样。所以,我建议你这样想:所有数组元素都存在,总是。您可以使用其他容器来按需添加元素,或者选择您自己的方式来指定值当前是否为您的算法"valid"。
如果您想要一个 x→y 映射列表,其中 x 不连续,也许您应该考虑 std::map
相反(虽然这确实带来了它自己的问题,即它可能会更慢)。或者,如果这些值永远不会被视为 "real" 值,您可以使用某种标记值,例如 -1
。
正如 Lightness 的评论和回答所写,您无法真正检查元素是否已被赋值。但是,您确实说过可以使用并行阵列来帮助您。如果您改用 int 会怎样?当您向数组添加值时,递增与数组一起传递的计数器。然后该计数器将保存数组已使用部分的 'length'。可能不理想,但它会起作用。像这样:
#include <iostream>
double calAverage(int*, int);
int main()
{
int *myArray = new int[50];
int myArrLength = 0;
double avg;
// add values to array
for (int i = 0, add = 5; add > i; i++)
{
myArray[i] = i;
myArrLength++;
}
avg = calAverage(myArray, myArrLength);
return 0;
}
double calAverage(int *arr, int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
sum += arr[i];
}
return sum / static_cast<double>(len);
}