You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何改造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:09:32