C++线性搜索返回匹配下标动态数组实现及std::vector优化咨询
问题分析
- 动态数组创建语法错误:C++ 中
new int[]不合法,必须指定数组初始长度,且原生动态数组无法自动扩容,需要提前统计匹配元素个数或者手动实现扩容逻辑 - 数组长度计算错误:函数形参中的
int* array是指针类型,sizeof(array)/sizeof(array[0])计算得到的是指针本身的字节长度除以int类型长度,不是原数组的元素个数,需要额外传入数组长度参数 - 返回值无法获取有效长度:返回的动态数组是指针类型,main函数中同样无法用
sizeof计算元素个数,需要额外通过输出参数返回匹配元素的数量 - 输出逻辑越界:就算数组长度计算正确,初始
i等于元素个数的话,occArray[i]属于下标越界访问,数组下标从0开始,最后一个有效元素下标是长度-1
原生指针实现修复版
#include <iostream> using namespace std; // 新增参数:数组长度arrLen,输出参数count返回匹配的元素个数 int* linearSearch(int* array, int arrLen, int num, int& count) { // 第一遍遍历统计匹配的元素个数 count = 0; for (int i = 0; i < arrLen; i++) { if (array[i] == num) count++; } if (count == 0) return nullptr; // 按匹配个数申请对应长度的动态数组 int* occArray = new int[count]; int idx = 0; // 第二遍遍历存储对应下标 for (int i = 0; i < arrLen; i++) { if (array[i] == num) { occArray[idx++] = i; } } return occArray; } int main() { int array[] = {3,4,5,3,6,8,7,8,3,5}, num=5; // 原数组在定义的作用域内可以用sizeof计算长度 int arrLen = sizeof(array)/sizeof(array[0]); int count = 0; int* occArray = linearSearch(array, arrLen, num, count); for (int i = 0; i < count; i++) { cout << occArray[i] << " "; } // 手动释放动态数组避免内存泄漏 delete[] occArray; return 0; }
std::vector实现版本(更简洁安全)
vector可以自动管理内存、自动扩容,不需要提前统计匹配长度,也不需要额外输出参数返回元素个数,直接调用size()方法即可获取匹配数量:
#include <iostream> #include <vector> using namespace std; vector<int> linearSearch(int* array, int arrLen, int num) { vector<int> occArray; for (int i = 0; i < arrLen; i++) { if (array[i] == num) { occArray.push_back(i); } } return occArray; } int main() { int array[] = {3,4,5,3,6,8,7,8,3,5}, num=5; int arrLen = sizeof(array)/sizeof(array[0]); vector<int> occArray = linearSearch(array, arrLen, num); // 范围for循环遍历更简洁 for (int idx : occArray) { cout << idx << " "; } return 0; }
内容的提问来源于stack exchange,提问作者Roey
相关产品推荐
相关产品推荐

