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
代替函数。
此代码来自 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)
- 这将 returnarr
使用的内存量(以字节为单位)。在我们的例子中,arr
是一个数组,因此表达式将 returnarr
占用的大小(以字节为单位)。sizeof(arr[0])
- 这也将 returnarr[0]
(注意 存储的内存量:它不是arr
) 。在我们的例子中,arr[0]
是数组的一个元素,因此表达式将 returnarr[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 * 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
代替函数。