C++数组按引用传递函数参数及std::array重载相关问题
嘿,咱们来逐个解决你的C++数组传参问题:
问题1:无需传递数组大小的C风格数组引用传递方法
当然有办法!你原来的代码里int arr[]作为参数其实等价于int* arr——这根本不是真正的数组传递,只是传了指针,所以必须额外传大小。但如果用数组引用的语法,就能让编译器在编译期获取数组的大小,不用手动传参。
方法1:固定大小的数组引用
如果你的数组大小是固定的,可以直接在参数里指定:
// 仅接受大小为5的int数组引用 int get_num_of_even_digited_input(int (&arr)[5]) { int count = 0; // 编译期已知大小,直接用范围for循环遍历 for (int num : arr) { if (get_number_of_digits(num) % 2 == 0) { count++; } } return count; }
调用的时候直接传数组就行:
int array2[] = {23, 334, 4567, 1, 259}; cout << get_num_of_even_digited_input(array2) << endl;
方法2:模板适配任意大小数组
如果想处理任意大小的C风格数组,用模板函数让编译器自动推导数组大小就好:
template <size_t Size> int get_num_of_even_digited_input(int (&arr)[Size]) { int count = 0; for (int num : arr) { if (get_number_of_digits(num) % 2 == 0) { count++; } } return count; }
不管你的数组是3个元素还是10个元素,编译器都会自动推导Size的值,调用方式和上面完全一样,不用管大小。
问题2:重载函数以接受std::array的原型写法
std::array是固定大小的模板容器,所以我们需要写一个模板函数来适配任意大小的std::array<int, N>。函数原型和实现如下:
#include <array> // 必须包含这个头文件才能用std::array template <size_t N> int get_num_of_even_digited_input(const std::array<int, N>& arr) { int count = 0; // 可以用范围for循环,或者arr.size()获取大小(编译期常量) for (int num : arr) { if (get_number_of_digits(num) % 2 == 0) { count++; } } return count; }
这里的N是模板参数,编译器会根据你传入的std::array的大小自动推导。调用的时候直接传数组对象就行,不用手动传size:
std::array<int, 6> array3 = {23, 5677, 564, 342, 44, 56778}; cout << get_num_of_even_digited_input(array3) << endl;
顺便修正你原代码里的几个小问题
void main()不符合C标准,应该写成int main(),最后返回0(C11及以后可以省略return,但建议加上)array3.size是错误的,std::array的size()是成员函数,要加括号:array3.size()- 需要包含
<iostream>和<array>头文件才能使用cout和std::array
完整的可运行代码
#include <iostream> #include <array> using namespace std; // 示例简化用,实际项目建议避免全局using int get_number_of_digits(int in_num) { int input = in_num; int dig_count = 0; // 修复原代码的while(input):当输入为0时会返回0,符合逻辑的话也可以,但更严谨的是判断input !=0 while (input != 0) { dig_count++; input = input / 10; } return dig_count; } // 原函数:接受C风格数组指针和大小 int get_num_of_even_digited_input(int arr[], int size_arr) { int count_of_evendigited_num = 0; for (int i = 0; i < size_arr; i++) { int count_of_dig = get_number_of_digits(arr[i]); if (count_of_dig % 2 == 0) { count_of_evendigited_num++; } } return count_of_evendigited_num; } // 重载1:任意大小的C风格数组引用 template <size_t Size> int get_num_of_even_digited_input(int (&arr)[Size]) { int count = 0; for (int num : arr) { if (get_number_of_digits(num) % 2 == 0) { count++; } } return count; } // 重载2:任意大小的std::array<int, N> template <size_t N> int get_num_of_even_digited_input(const std::array<int, N>& arr) { int count = 0; for (int num : arr) { if (get_number_of_digits(num) % 2 == 0) { count++; } } return count; } int main() { int array2[] = {23, 334, 4567, 1, 259}; int sizearr2 = sizeof(array2)/sizeof(int); std::array<int, 6> array3 = {23, 5677, 564, 342, 44, 56778}; // 调用原函数 cout << "Count of even digited numbers in array2[] (original): " << get_num_of_even_digited_input(array2, sizearr2) << endl; // 调用数组引用重载 cout << "Count of even digited numbers in array2[] (ref overload): " << get_num_of_even_digited_input(array2) << endl; // 调用std::array重载 cout << "Count of even digited numbers in array3[]: " << get_num_of_even_digited_input(array3) << endl; return 0; }
内容的提问来源于stack exchange,提问作者Manasa
相关产品推荐
相关产品推荐

