C++实现Heap算法时数组与vector指针转换赋值报错问题
问题排查与修复方案
核心错误原因
- 参数类型不匹配导致的成员调用错误
generate函数的第三个参数声明为vector<int> output[],本质是vector<int>*类型的指针,不能直接调用.end()方法,需要先解引用才能调用vector的成员方法。 - 对
end()方法的使用逻辑错误vector::end()返回的是尾后迭代器,指向最后一个元素的下一个位置,本身不指向合法存储区域,不能直接对其赋值。要向vector尾部追加元素应使用push_back()方法。 - 数组长度计算逻辑错误
数组作为函数参数传递时会退化为指针,(&heapArr + 1) - &heapArr的计算结果永远为1,无法得到原数组的实际长度,需要额外传入数组长度参数。 - 循环条件全部书写错误
- 遍历heapArr的循环条件写为
i = heaparrlen,属于赋值操作而非比较,会导致死循环/不执行 - 内层循环条件写为
n-1,只要n>1就永远为真,会触发死循环 - main函数的输入循环条件写为
i>numberofnumbers,初始i=0时条件永远不成立,无法读取输入
- 遍历heapArr的循环条件写为
- swap函数参数设计错误
swapnumbers声明接收int *arraytoswap [](指针数组),但实际传入的是普通int数组的地址,类型不匹配,无需二级指针即可完成数组元素交换。 - 非标准语法使用
int input[numberofnumbers]属于C语言的变长数组(VLA),标准C++不支持该语法,运行时长度的序列应使用vector存储。
修复后完整代码
#include <vector> #include <iostream> using namespace std; // 简化swap函数,直接接收int数组即可 void swapnumbers(int arraytoswap[], int indexa, int indexb) { int temp = arraytoswap[indexa]; arraytoswap[indexa] = arraytoswap[indexb]; arraytoswap[indexb] = temp; } // 调整参数:增加数组长度参数arrLen,output改为指针传递 void generate(int n, int heapArr[], int arrLen, vector<int>* output ) { if (n == 1) { // 直接遍历已知长度的数组,追加到output for (int i = 0; i < arrLen; i++) { output->push_back(heapArr[i]); } // 添加分隔符区分不同排列 output->push_back(-1); return; } else { generate(n -1, heapArr, arrLen, output); // 修正循环条件:i < n-1 for (int i = 0; i < n-1; i++) { if (n%2 == 0) { swapnumbers(heapArr, i, n-1); } generate(n-1, heapArr, arrLen, output); } } } int main() { int numberofnumbers; int tempint; cout<<"how many numbers will you input?"<<endl; cin>>numberofnumbers; vector<int> output; // 替换变长数组为vector vector<int> input(numberofnumbers); // 修正循环条件为i < numberofnumbers for (int i=0; i<numberofnumbers; i++) { cout<<"input the "<< i+1 <<"th number"<<endl; cin>>tempint; input[i] = tempint; } // 传入数组长度参数 generate(numberofnumbers, input.data(), numberofnumbers, &output); // 输出结果验证 cout << "generated permutations: " << endl; for (auto num : output) { if (num == -1) { cout << endl; continue; } cout << num << " "; } return 0; }
内容的提问来源于stack exchange,提问作者Insertgenericcodingname
相关产品推荐
相关产品推荐

