自定义qsort函数引发匹配警告及错误的原因与解决方法咨询
关于qsort函数调用错误与警告的问题解析
错误与警告的原因
咱们先拆解一下你遇到的问题:
- 命名冲突引发警告:你自定义的函数名
qsort和C标准库<stdlib.h>里的标准排序函数qsort完全重名了。编译器处理代码时,同时找到了两个候选函数——一个是标准库的void qsort(void*, size_t, size_t, int (*)(const void*,const void*)),另一个是你写的int qsort(vector<int>&arr),所以抛出警告提示你存在多个可选函数。 - 调用参数不匹配导致报错:从错误信息
no matching function for call to qsort(int[((unsigned int)((int)n))])能看出来,你在代码其他地方调用qsort时,传入的是原始int数组,但你自定义的qsort要求的参数是vector<int>&(vector的引用),参数类型完全不匹配,编译器找不到合适的函数调用,因此直接报错。
解决方法
针对这两个问题,咱们一步步处理:
- 第一步:修改自定义函数名,避免命名冲突
把你写的快速排序函数改名,比如改成myQuickSort或者quickSort,彻底避开和标准库函数的重名问题,这能直接消除警告。 - 第二步:确保函数调用的参数类型正确
如果你的数据是原始int数组,要么把数组转换成vector<int>再传给自定义排序函数,要么修改自定义函数的参数,让它支持直接接收int数组(同时记得改函数名)。
修改后的代码示例
这里给你整理好的代码,不仅改了函数名,还修正了原函数的返回值问题(原函数声明返回int但没有return语句,属于未定义行为,改成void更合理,因为排序直接修改传入的vector即可):
#include <vector> #include <iostream> using namespace std; int par(vector<int>&arr, int low, int high) { int pivot = arr[low]; while(low < high) { while(low < high && arr[high] >= pivot)high--; arr[low] = arr[high]; while(low < high && arr[low] <= pivot)low++; arr[high] = arr[low]; } arr[low] = pivot; return low; } // 改名成myQuickSort,返回值改为void void myQuickSort(vector<int>&arr) { int mystack[2000]; int top = -1; mystack[++top] = 0; mystack[++top] = arr.size() - 1; while(top > 0) { int high = mystack[top--], low = mystack[top--]; int middle = par(arr, low, high); if(middle+1 < high) { mystack[++top] = middle+1; mystack[++top] = high; } if(low < middle-1) { mystack[++top] = low; mystack[++top] = middle-1; } } } // 调用示例(适配原始int数组的情况) int main() { int arr[] = {3,1,4,1,5,9}; vector<int> vec(arr, arr + sizeof(arr)/sizeof(arr[0])); myQuickSort(vec); // 输出排序后的结果 for(int num : vec) { cout << num << " "; } return 0; }
内容的提问来源于stack exchange,提问作者CuteSheep233
相关产品推荐
相关产品推荐

