无法找到数组的大小和输出问题
Trouble to find size of an Array & Output issue
我正在实施二进制搜索。但我不想将数组的大小作为参数传递给 binarySearch
函数。我试图在函数中找到数组大小。我用的是sizeof operator
,但是二分查找的输出是错误的。当我尝试将数组的大小作为参数传递时,输出很好。我的问题是为什么以及在函数中计算数组大小的问题是什么?是否可以在函数中计算数组大小?
这是我的方法:
code
#include <bits/stdc++.h>
using namespace std;
void binarySearch(int arr[], int value)
{
int c = sizeof(arr) / sizeof(arr[0]);
//cout << c;
int low = 0, high = c - 1, notFound = 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (arr[mid] == value)
{
cout << "Found at index " << mid << endl;
notFound = 0;
break;
}
if (arr[mid] < value)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
if (notFound == 1)
{
cout << "Not Found" << endl;
}
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 9, 56, 88};
int x = 3;
binarySearch(arr, x);
//cout << p << endl;
}
输出:
tempCodeRunnerFile.cpp:5:22: warning: 'sizeof' on array function parameter 'arr' will return size of 'int*' [-Wsizeof-array-argument]
int c = sizeof(arr) / sizeof(arr[0]);
^
tempCodeRunnerFile.cpp:3:23: note: declared here
void binarySearch(int arr[], int value)
~~~~^~~~~
Not Found
我的预期输出:
Found at index 2
My question is why & what is the problem for calculating array size in function
问题是 arr
是指向数组元素的指针。指针的大小与数组的大小无关,这就是为什么您尝试 sizeof(arr)
无法工作的原因。
警告信息也很好地解释了这一点。
is it possible to calculate array size in function?
只给定一个指向元素的指针,一般1不可能确定数组的大小。这就是为什么您必须将大小作为参数传递的原因。
我更喜欢的另一种方法是将指针和长度封装在class中。有一个用于此目的的标准 class 模板:std::span
.
void binarySearch(std::span<int> arr, int value)
{
int c = arr.size();
...
// call as in your example:
int arr[] = {1, 2, 3, 4, 5, 6, 9, 56, 88};
int x = 3;
binarySearch(arr, x);
1 有一些技术可以做到这一点,但它们也有缺点。
一种技术是选择一个元素值作为“终止符”又名“哨兵”,表示数组的结尾。这样,您可以对终止符进行线性搜索以确定长度。这通常用于 C 中的字符串,其中空终止符终止字符串。如果您不能将任何值指定为终止符,则此技术不是一种选择。另一个明显的缺点是大小计算的线性复杂性,它比您正在实施的二进制搜索渐近地更昂贵
您还可以使用另一种可能性,但使用太多不同大小的数组调用它可能会导致代码膨胀。
template<std::size_t N>
void binarySearch(int arr[N], int value)
然后使用N
代替c
。
我正在实施二进制搜索。但我不想将数组的大小作为参数传递给 binarySearch
函数。我试图在函数中找到数组大小。我用的是sizeof operator
,但是二分查找的输出是错误的。当我尝试将数组的大小作为参数传递时,输出很好。我的问题是为什么以及在函数中计算数组大小的问题是什么?是否可以在函数中计算数组大小?
这是我的方法:
code
#include <bits/stdc++.h>
using namespace std;
void binarySearch(int arr[], int value)
{
int c = sizeof(arr) / sizeof(arr[0]);
//cout << c;
int low = 0, high = c - 1, notFound = 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (arr[mid] == value)
{
cout << "Found at index " << mid << endl;
notFound = 0;
break;
}
if (arr[mid] < value)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
if (notFound == 1)
{
cout << "Not Found" << endl;
}
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 9, 56, 88};
int x = 3;
binarySearch(arr, x);
//cout << p << endl;
}
输出:
tempCodeRunnerFile.cpp:5:22: warning: 'sizeof' on array function parameter 'arr' will return size of 'int*' [-Wsizeof-array-argument]
int c = sizeof(arr) / sizeof(arr[0]);
^
tempCodeRunnerFile.cpp:3:23: note: declared here
void binarySearch(int arr[], int value)
~~~~^~~~~
Not Found
我的预期输出:
Found at index 2
My question is why & what is the problem for calculating array size in function
问题是 arr
是指向数组元素的指针。指针的大小与数组的大小无关,这就是为什么您尝试 sizeof(arr)
无法工作的原因。
警告信息也很好地解释了这一点。
is it possible to calculate array size in function?
只给定一个指向元素的指针,一般1不可能确定数组的大小。这就是为什么您必须将大小作为参数传递的原因。
我更喜欢的另一种方法是将指针和长度封装在class中。有一个用于此目的的标准 class 模板:std::span
.
void binarySearch(std::span<int> arr, int value)
{
int c = arr.size();
...
// call as in your example:
int arr[] = {1, 2, 3, 4, 5, 6, 9, 56, 88};
int x = 3;
binarySearch(arr, x);
1 有一些技术可以做到这一点,但它们也有缺点。
一种技术是选择一个元素值作为“终止符”又名“哨兵”,表示数组的结尾。这样,您可以对终止符进行线性搜索以确定长度。这通常用于 C 中的字符串,其中空终止符终止字符串。如果您不能将任何值指定为终止符,则此技术不是一种选择。另一个明显的缺点是大小计算的线性复杂性,它比您正在实施的二进制搜索渐近地更昂贵
您还可以使用另一种可能性,但使用太多不同大小的数组调用它可能会导致代码膨胀。
template<std::size_t N>
void binarySearch(int arr[N], int value)
然后使用N
代替c
。