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

能否无额外分配将std::vector<std::unique_ptr<int>>作为原生指针向量传入?

传递std::unique_ptr向量给原生指针向量参数的方案

首先明确:标准合规且完全无额外内存分配的方法不存在。std::vector<std::unique_ptr<int>>与std::vector<int*>是两种独立的容器类型,它们的元素布局仅在部分平台上可能巧合一致,但C++标准并未做出任何保证,直接强制类型转换属于未定义行为,可能导致程序崩溃或不可预期的结果。

平台相关的风险方案(不推荐)

如果可以接受平台和编译器依赖的风险(仅在std::unique_ptr<int>内存大小与int*完全相同的环境,比如绝大多数64位系统),可以尝试强制类型转换:

sum(reinterpret_cast<const std::vector<int*>&>(my_ints));

这种写法完全依赖具体实现,不具备可移植性,强烈不推荐用于生产代码。

标准合规的替代方案

如果不想修改sum函数,唯一标准合规的做法是创建临时原生指针向量,通过reserve预分配空间可将内存开销降到最低:

std::vector<int*> raw_ptrs;
raw_ptrs.reserve(my_ints.size()); // 预分配足够空间,避免多次扩容
for (const auto& up : my_ints) {
    raw_ptrs.push_back(up.get());
}
sum(raw_ptrs);

更优雅的长期方案(允许修改/扩展sum函数)

如果可以调整sum函数,推荐改为模板函数以兼容任意容器类型:

template <typename InputIt>
int sum(InputIt begin, InputIt end) {
    int total = 0;
    for (; begin != end; ++begin) {
        total += **begin; // 适配原生指针与unique_ptr的双重解引用
    }
    return total;
}

// 调用示例:
sum(my_ints.begin(), my_ints.end());
sum(raw_ptr_vector.begin(), raw_ptr_vector.end());

或者新增重载版本,复用原有逻辑:

void sum(const std::vector<std::unique_ptr<int>>& input) {
    std::vector<int*> raw_ptrs;
    raw_ptrs.reserve(input.size());
    for (const auto& up : input) {
        raw_ptrs.push_back(up.get());
    }
    sum(raw_ptrs);
}

内容的提问来源于stack exchange,提问作者mrmclovin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:55:15