如何改造C++固定数组元素检测代码以适配动态数组?
适配动态数组的元素存在性检测实现
原代码仅适用于编译期确定大小的固定数组,因为模板参数std::size_t N是编译期常量,无法适配运行时才确定长度的动态分配数组(比如new int[size]创建的数组)。以下是两种无需使用std::vector的修改方案:
方案一:显式传入数组长度
直接修改函数,新增一个参数接收数组的长度,不再依赖编译期的模板参数N:
#include <iostream> template <typename T> bool IsIn(T value, const T* values, std::size_t length) { for (std::size_t i = 0; i < length; ++i) { if (value == values[i]) { return true; } } return false; } int main() { // 静态数组使用示例 int arr1[] = {10, 20, 30}; bool ee1 = IsIn(10, arr1, sizeof(arr1)/sizeof(arr1[0])); std::cout << "ee1 = " << (ee1 ? "true" : "false") << "\n"; // 动态数组使用示例 std::size_t dynamicSize = 5; int* dynamicArr = new int[dynamicSize]{1,2,3,4,5}; bool ee2 = IsIn(3, dynamicArr, dynamicSize); std::cout << "ee2 = " << (ee2 ? "true" : "false") << "\n"; delete[] dynamicArr; // 记得释放动态分配的内存 return 0; }
- 静态数组可以通过
sizeof(arr)/sizeof(arr[0])计算长度,这是C++中传统的静态数组长度计算方式。 - 动态数组需要在创建时记录长度,调用函数时传入即可。
方案二:使用C++17的std::span
如果你的编译器支持C++17及以上,可以使用std::span——它是一个轻量级的数组视图,不持有数据,仅封装指针和长度,同时兼容静态数组和动态数组:
#include <iostream> #include <span> // 需包含span头文件 template <typename T> bool IsIn(T value, std::span<const T> span) { for (const T& elem : span) { if (value == elem) { return true; } } return false; } int main() { // 静态数组可直接隐式转换为std::span int arr1[] = {10,20,30}; bool ee1 = IsIn(10, arr1); std::cout << "ee1 = " << (ee1 ? "true" : "false") << "\n"; // 动态数组需手动构造std::span std::size_t dynamicSize = 4; int* dynamicArr = new int[dynamicSize]{100,200,300,400}; bool ee2 = IsIn(300, std::span<const int>(dynamicArr, dynamicSize)); std::cout << "ee2 = " << (ee2 ? "true" : "false") << "\n"; delete[] dynamicArr; return 0; }
std::span的优势在于不需要手动计算或传递长度(静态数组自动推导),同时避免了裸指针的一些不安全操作,用法更简洁直观。
内容的提问来源于stack exchange,提问作者CaTx
相关产品推荐
相关产品推荐

