C++ 如何用泛型函数查找任意算术类型的数组的中值?
时间: 2024-05-14 15:13:52 浏览: 7
可以使用模板函数来实现泛型函数,可以接受任意算术类型的数组,并计算出中值。下面是一个实现示例:
```c++
#include <iostream>
#include <algorithm>
template<typename T>
T findMedian(T arr[], int n){
std::sort(arr, arr + n);
if(n % 2 == 0){
return (arr[n / 2 - 1] + arr[n / 2]) / 2;
}else{
return arr[n / 2];
}
}
int main(){
int arr1[] = {1, 2, 3, 4, 5, 6};
double arr2[] = {1.5, 2.5, 3.5, 4.5, 5.5};
std::cout << findMedian(arr1, 6) << std::endl;
std::cout << findMedian(arr2, 5) << std::endl;
return 0;
}
```
这个示例中,我们定义了一个模板函数 `findMedian`,它可以接受任意算术类型的数组以及数组的长度,通过排序求出数组的中值并返回。在主函数中分别调用了 `findMedian` 函数来计算两个不同类型的数组的中值。
相关问题
C++ 如何编写能用于任意算术类型的泛型函数?
答:您可以使用模板来编写泛型函数,例如:
```
template<typename T>
T add(T a, T b) {
return a + b;
}
```
在这个例子中,`typename T` 表示 `T` 是一个类型参数,可以是任意类型。函数 `add` 的参数 `a` 和 `b` 都是类型 `T`,并且返回值也是类型 `T`,可以适用于任意算术类型。
C++ 如何编写能用于数组的泛型函数?
要编写能用于数组的泛型函数,可以使用 C 语言的泛型指针 void*,将数组的元素转换为 void* 类型,再进行操作。例如,下面是一个计算数组元素之和的泛型函数示例代码:
```c
#include <stdio.h>
// 泛型函数,计算数组元素之和
int sum(void* arr, int count, size_t size, int (*get)(void*, int))
{
int total = 0;
for (int i = 0; i < count; i++) {
void* elem = (char*)arr + i * size; // 指向第 i 个元素的指针
total += get(elem, i);
}
return total;
}
// 整型数组元素的获取函数
int get_int(void* elem, int index)
{
int* p = (int*)elem;
return *p;
}
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int count = sizeof(arr) / sizeof(arr[0]);
int total = sum(arr, count, sizeof(int), get_int);
printf("total = %d\n", total);
return 0;
}
```
在上面的代码中,sum 函数的参数 arr 表示数组的起始地址,count 表示数组的元素个数,size 表示数组元素的大小,get 函数是对数组元素进行操作的回调函数。get 函数的第一个参数 elem 是指向数组元素的指针,在函数内部需要将其转换为合适的类型,并返回相应的计算结果。
示例代码中,get_int 函数是获取整型数组元素的回调函数,其接收一个 void* 类型的指针和该元素的下标,将指针转换为 int* 类型,并返回该元素的值。最后,main 函数利用 sum 函数计算数组元素之和,并输出结果。