在C 中实现IN_Array

Implement in_array in c++

本文关键字:Array IN 实现      更新时间:2023-10-16

很容易在向量中找到一个项目,我们知道如何。如果我们知道数组的长度,也可以在数组中找到一个项目。但是,从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);

但是,如果将其转换为函数:

bool in_array(int arr[], int needle){
    int* result = std::find(begin(arr), end(arr), needle);
    return result!=end(arr);
}

不会编译:

错误:呼叫" begin(int*&)’int*结果=无匹配函数= std :: find(std :: begin(arr),std :: end(arr),针);

目的是制作一个工作功能,以将任何类型的数组发送到它,就像PHP的in_array一样:

template <typename T>
T in_array(T arr[],T needle){
    T* result = std::find(begin(arr), end(arr), needle);
    return result!=end(arr);
}

为什么此代码不起作用?C 编译器是否存储某种局部变量来确定arr的结束?

此行:

int arr[] = {1,2,3,4,5};

不是创建类型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);
}

错误:呼叫" begin(int*&amp;)'int* result = std :: find(std :: std :: begin(arr),std :: end(arr),针头),/blockquote>

 int arr[] = {1,2,3,4,5};

元素的大小/数量,如果已知,则在

 bool in_array(int arr[], int needle){

元素的数量未知,array只是被称为int

的指针