C++数组操作报request for member 'size' in 'arr1'错误求解
报错原因
你收到的报错信息:
error: request for member 'size' in 'arr1', which is of non-class type 'int*'
核心原因有两点:
- C风格数组作为函数参数传递时会自动退化为指针,你在函数形参定义的
int arr1[]本质会被编译器处理为int* arr1,指针属于基础类型,不是类,没有size()成员方法,调用arr1.size()自然会触发报错。 - 后续调用
arr3.size()也存在相同问题:你定义的int arr3[n3]属于C风格变长数组(VLA),这是GCC等编译器的扩展语法,不属于标准C++特性,所有C风格数组无论是否变长,都没有size()成员方法。
额外提醒:你当前逻辑是合并两个有序数组求中位数,但你传入的两个原数组未排序,就算编译通过运行结果也不正确,需要先对输入数组排序再合并。
修复方案
方案1:使用已传入的长度参数(最低改动)
你已经在main函数中计算了两个数组的长度n1、n2,也提前算出了合并后数组的总长度n3,直接用这三个变量替换所有size()调用即可,同时补充排序逻辑,替换非标准的变长数组为动态申请内存:
#include <iostream> #include <algorithm> using namespace std; void median_arr(int arr1[],int arr2[],int n1,int n2) { // 先对输入数组排序,才能合并得到有序数组 sort(arr1, arr1 + n1); sort(arr2, arr2 + n2); int n3 = n1 + n2; int* arr3 = new int[n3]; int i=0,j=0,k=0; while(i < n1 && j < n2) { if(arr1[i] < arr2[j]) arr3[k++] = arr1[i++]; else arr3[k++] = arr2[j++]; } while(i < n1) arr3[k++] = arr1[i++]; while(j < n2) arr3[k++] = arr2[j++]; int mid = n3 / 2; double median = 0; if(n3 % 2 == 1) median = arr3[mid]; else median = (arr3[mid] + arr3[mid-1]) / 2.0; cout << median << endl; delete[] arr3; } int main() { int arr1[] = {1,2,8,9,7}; int n1 = sizeof(arr1)/sizeof(arr1[0]); int arr2[] = {5,6,3}; int n2 = sizeof(arr2)/sizeof(arr2[0]); median_arr(arr1, arr2, n1, n2); return 0; }
运行输出正确中位数为5.5。
方案2:使用标准库容器替代C风格数组
直接用std::vector传递数组,自带size()方法,不需要手动计算长度,符合标准C++语法,可移植性和可维护性更高:
#include <iostream> #include <vector> #include <algorithm> using namespace std; void median_arr(vector<int> arr1, vector<int> arr2) { sort(arr1.begin(), arr1.end()); sort(arr2.begin(), arr2.end()); int n1 = arr1.size(), n2 = arr2.size(), n3 = n1 + n2; vector<int> arr3(n3); int i=0,j=0,k=0; while(i < n1 && j < n2) arr3[k++] = arr1[i] < arr2[j] ? arr1[i++] : arr2[j++]; while(i < n1) arr3[k++] = arr1[i++]; while(j < n2) arr3[k++] = arr2[j++]; int mid = n3 / 2; double median = n3%2 ==1 ? arr3[mid] : (arr3[mid] + arr3[mid-1])/2.0; cout << median << endl; } int main() { vector<int> arr1 = {1,2,8,9,7}; vector<int> arr2 = {5,6,3}; median_arr(arr1, arr2); return 0; }
内容的提问来源于stack exchange,提问作者fahim sifat
相关产品推荐
相关产品推荐

