让我们为 C 做一个类似map 的函数。
void apply(int *arr, size_t len, int (*func)(int))
{
for(size_t i = 0; i < len; i++)
arr[i] = func(arr[i]);
}
这样,我们可以将处理整数的函数转换为处理整数数组。我们也可以做一个类似的版本:
void apply_enumerated(int *arr, size_t len, int (*func)(size_t, int))
{
for(size_t i = 0; i < len; i++)
arr[i] = func(i, arr[i]);
}
这做同样的事情,但允许我们的函数知道它在哪个元素上。我们可以使用这个,例如:
int cube(int i) { return i * i * i }
void print_array(int *array, size_t len, char *sep)
{
if(sep == NULL) sep = ", ";
printf("%d", *array);
for(size_t i = 1; i < len; i++) printf("%s%d", sep, array[i])
}
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
int main(void)
{
int array[5] = { 1, 2, 3, 4, 5 };
print_array(array, ARRAY_SIZE(array), NULL);
apply(array, ARRAY_SIZE(array), cube);
print_array(array, ARRAY_SIZE(array), NULL);
return 0;
}
该代码将打印:
1, 2, 3, 4, 5
1, 8, 27, 64, 125
对于我们的枚举示例:
int mult(size_t i, int j) { return i * j }
// print_array and ARRAY_SIZE as before
int main(void)
{
int array[5] = { 1, 2, 3, 4, 5 };
print_array(array, ARRAY_SIZE(array), NULL);
apply_enumerated(array, ARRAY_SIZE(array), mult);
print_array(array, ARRAY_SIZE(array), NULL);
return 0;
}
打印出来:
1, 2, 3, 4, 5
0, 2, 6, 12, 20
作为一个更真实的示例,字符串库可以具有一个函数,该函数将一个对单个字符进行操作的函数应用于字符串中的所有字符。此类函数的一个示例是 ctype.h 中的标准库 toupper() 和 tolower() 函数 - 我们可以使用此 string_apply() 函数轻松创建 string_toupper() 函数。