在 C++ 中搜索动态分配数组中的出现次数

Posted

技术标签:

【中文标题】在 C++ 中搜索动态分配数组中的出现次数【英文标题】:Searching the number of occurrences in a dynamically allocated array in C++ 【发布时间】:2020-02-08 13:42:07 【问题描述】:

这是我用来创建数组的方法。

int* createArray(int N)


    int* array = new int[N];

    for (int i = 0; i < N; i++)
    
        int rand_num = rand() % 10;
        array[i] = rand_num % 10;
    

    return array;


这是我用来计算出现次数的方法 使用线性搜索的数组

    int linearSearch(int* nums, int N, int val)

    int count = 0;
    for (int i = 0; i <= N; i++)
    
        if (val == *nums)
        
            count+=1;
        
    

    return count;

这是主要方法。线性搜索方法甚至返回 1 虽然数组中有两个。我该如何解决这个问题?

int main()



int N = 5;
    int* arr =  createArray(N);

    for (int i = 0; i < N; i++)
    
        cout << *arr++ << " " << endl;
    

    cout << linearSearch(arr, N, 1) << " " << endl;

    return 0;

【问题讨论】:

这是为了教育目的,一些关于指针和搜索算法的课程吗? 另一个错误是您的循环在线性搜索中执行了N + 1 次。确保将 i &lt;= N 更改为 i &lt; N 请注意:一旦发布的答案指出您的代码中存在错误,您就不应修复该错误 - 因为这会使答案无效,即使它是“善意”发布的'。 rand_num % 10;int rand_num = rand() % 10; 之后有什么意义?请查看&lt;random&gt; 标头提供的现代功能,或者至少在main 中调用srand 【参考方案1】:

我认为您不会在函数 shearch 中增加 *nums。

所以你总是比较数组[0]。

【讨论】:

您是否像@Arden Coder 在顶部所说的那样将 i 是的,我做到了,我会的 天哪!我没有看到,但是当您在主“for”中打印时,指针会移到数组的末尾!因此,当您在 shearch 函数中增加指针时,您会内存不足!【参考方案2】:

您的代码中至少有三个错误!两个在您的 linearSearch 函数中,其中 (a) 您不增加在 if (val == *nums) 行中指向的地址和 (b) 您在循环中使用 @987654323 去“超出数组末尾的一个” @(大小为N 的数组的最后一个元素有一个索引N-1)。这是一个固定版本:

int linearSearch(int* nums, int N, int val)

    int count = 0;
    for (int i = 0; i < N; i++) 
        if (val == *nums++) 
            count += 1;
        
    
    return count;

第三个问题也许更微妙。在您的主代码中,您首先将指针arr 分配给createArray 返回的地址,这里:

int* arr = createArray(N);

然后,在您的输出循环中,您修改(增加)该地址的值:

    cout << *arr++ << " " << endl;

因此,当您稍后执行这行 linearSearch(arr, N, 1); 时,arr 的值将错误 - 您会得到未定义的行为,试图访问无效内存。

我建议在输出循环中使用 数组索引,如下所示:

    for (int i = 0; i < N; i++) 
        cout << arr[i] << " " << endl;
    

请随时要求进一步澄清和/或解释。

【讨论】:

我已经按照您指出的那样编辑了上面的代码,但控制台仍然输出错误的值 @Brian - 在发布答案时不要继续编辑您的问题! @Brian - 您需要所有三个更正 - 但在代码的“本地副本”中进行这些更正。 好的。您还有其他想法为什么输出错误的值吗? @Brian 在我的电脑上,代码现在将1 7 4 0 9 1 作为其输出 - 这是正确的(数组中只有一个 1 - 最后一个是搜索的结果)。跨度>

以上是关于在 C++ 中搜索动态分配数组中的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

需要有关 C++ 中二维数组的动态内存分配的帮助

C++ 动态内存分配与结构中的数组

指向 C++ 中动态分配的二维数组中的一行的指针

C++问题中的动态数组分配

如何使用 C++ 中的指针动态分配和解除分配二维数组?

C++数组在内存中的分配