C++线性搜索算法,确定数组中元素的个数

C++ Linear search algorithm, determining the number of elements in array

此代码来自 Geeks for Geeks Algorithms 部分,我不理解这部分

int n = sizeof(arr) / sizeof(arr[0]); 

在 main 函数中,特别说明为什么用 sizeof(arr[0]) 进行除法会导致数组中实际元素数量的一半。 希望有人能给我解释一下。

// C++ code to linearly search x in arr[]. If x 

// is present then return its location, otherwise 
// return -1 

#include <iostream> 
using namespace std; 

int search(int arr[], int n, int x) 
{ 
    int i; 
    for (i = 0; i < n; i++) 
        if (arr[i] == x) 
            return i; 
    return -1; 
} 

int main(void) 
{ 
    int arr[] = { 2, 3, 4, 10, 40 }; 
    int x = 10; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    int result = search(arr, n, x); 
(result == -1)? cout<<"Element is not present in array"
                : cout<<"Element is present at index " <<result; 
return 0; 
}

sizeof() returns 元素使用的内存。

假设 c++ 使用 x 字节用于 int

因此 int 包含 5 个元素的数组的大小为 5x。

sizeof(arr) returns 5 个元素的整数数组使用的内存是 5x。

sizeof(arr[0]) returns 整数 x 使用的内存。

所以sizeof(arr) / sizeof(arr[0])将return5作为尺寸

语句int n = sizeof(arr) / sizeof(arr[0]); 用于查找arr中的元素个数。

它是如何工作的?

  • sizeof(arr) - 这将 return arr 使用的内存量(以字节为单位)。在我们的例子中,arr 是一个数组,因此表达式将 return arr 占用的大小(以字节为单位)。

  • sizeof(arr[0]) - 这也将 return arr[0](注意 存储的内存量:它不是arr) 。在我们的例子中,arr[0] 是数组的一个元素,因此表达式将 return arr[0] 占用的大小(以字节为单位)。

  • 现在,sizeof(arr) / sizeof(arr[0] 将 return 数组中的元素数。如何? - sizeof(arr) 给了我们数组的总大小(以字节为单位),sizeof(arr[0]) 给了我们只有 1 个元素的大小。所以除以它们,我们得到数组中元素的数量。


注意:每个元素的大小都是一样的,所以并不是说你只需要选择arr[0]。您可以选择 arr[3] 或任何其他索引,因为它在数组范围内

希望这能消除您的疑虑!

让我们考虑声明的数组

int arr[] = { 2, 3, 4, 10, 40 };

由于未指定数组的大小,因此数组中元素的数量等于初始值设定项的数量。

统计元素个数并不难。它等于 5。所以数组由 int.

类型的 5 个元素组成

分配给数组的内存等于5 * sizeof( int )。它与 5 * sizeof( arr[0] ) 相同,因为元素 arr[0] 的类型为 int.

所以整个 arrau 的大小是

sizeof( arr ) = 5 * sizeof( arr[0] )

有了这个公式,就可以很容易地确定数组中元素的数量及其大小和存储元素的大小。即

5 = sizeof( arr ) / sizeof( arr[0] )

所以有一个任意数组arr你可以通过以下方式确定元素的数量

N = sizeof( arr ) / sizeof( arr[0] )

函数搜索期望第二个参数将指定传递的数组中的元素数

int search(int arr[], int n, int x);

而如上图计算出来的就是

int n = sizeof(arr) / sizeof(arr[0]); 
int result = search(arr, n, x); 

如果您的编译器支持 C++ 17 标准,那么您可以使用标准函数 std::size,例如

,而不是使用此公式
int result = search(arr, std::size( arr ), x); 

注意函数声明和定义有问题

例如,表达式 sizeof(arr) / sizeof(arr[0]) 的类型为 size_t,但相应的函数参数的类型为 int。类型 int 可能不够大,无法存储类型 size_t 的值。其次,由于数组在函数中未被更改,因此第一个参数应具有限定符 const.

函数可以通过以下方式声明和定义

size_t search( const int arr[], size_t n, int x) 
{
    size_t i = 0;

    while ( i != n && arr[i] != x ) ++i;

    return i;
}

如果在数组中找不到目标值,则函数returns数组的大小为n。

请注意,可以使用标准算法 std::find 代替函数。