在向量中找到项目很容易,我们知道如何.如果我们知道数组的长度,也可以在数组中找到一个项目.但是从c ++ 11开始,发布了std :: end(),看起来我们可以通过调用它的指针来获取数组的大小,对吧?
所以这段代码有效:
int arr[] = {1,2,3,4,5};
int needle = 3;
std::find(begin(arr), end(arr), needle);
int* result = find(begin(arr), end(arr), needle);
bool exists = result!=end(arr);
Run Code Online (Sandbox Code Playgroud)
但是,如果将此转换为函数:
bool in_array(int arr[], int needle){
int* result = std::find(begin(arr), end(arr), needle);
return result!=end(arr);
}
Run Code Online (Sandbox Code Playgroud)
不会编译:
错误:没有匹配函数来调用'begin(int*&)'int*result = std :: find(std :: begin(arr),std :: end(arr),needle);
目标是使一个工作函数向其发送任何类型的数组,就像in_arrayPhp一样:
template <typename T>
T in_array(T arr[],T needle){
T* result = std::find(begin(arr), end(arr), needle);
return result!=end(arr);
}
Run Code Online (Sandbox Code Playgroud)
为什么这段代码不起作用?C++编译器是否存储某种局部变量来确定结束arr?
这一行:
int arr[] = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
不创建类型的数组int[]但是int[5].您可以通过询问数组的大小来检查它,它将返回sizeof(int)*5.
但是对于函数,你没有传递大小(看到数组衰减后的错误信息),只是一个指针,所以没有可能得到end()它.
你能做的就是传递大小(未测试,但应该是好的):
template <typename T, int N>
bool in_array(T arr[N],T needle){
T* result = std::find(begin(arr), end(arr), needle);
return result!=end(arr);
}
Run Code Online (Sandbox Code Playgroud)