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

C++非友元外部函数遍历私有unique_ptr数组求内积问题

最简实现方案

不需要自行实现完整自定义迭代器,直接利用标准库的整数范围视图配合STL累加算法即可,全程不违反任何限制条件,代码量极小。

核心逻辑

你已经对外暴露了size()获取向量长度、const版本at()按下标取值的公有接口,完全不需要访问私有成员。通过标准库生成0到size()-1的下标序列,把序列迭代器传给STL算法,在算法的回调逻辑里通过at()访问对应位置元素计算乘积累加即可。

满足约束的说明

  • 不新增类公有成员:仅调用类已实现的size()、at()const接口
  • 不使用友元:全程不接触类的私有成员my_vector、size_
  • 不使用C风格for循环:所有遍历逻辑由STL算法完成,无显式下标循环
  • 不使用STL容器:用到的范围视图是惰性计算的轻量对象,不持有元素存储,不属于STL容器范畴

代码实现

#include <numeric>
#include <ranges>
#include <stdexcept>

int inner_product(const vector_class& a, const vector_class& b) {
    if (a.size() != b.size()) {
        throw std::invalid_argument("两个向量长度不匹配,无法计算内积");
    }
    // 生成0到a.size()-1的连续下标序列,自带标准实现的迭代器
    auto index_view = std::views::iota(0, a.size());
    // 调用STL累加算法完成遍历计算
    return std::accumulate(
        index_view.begin(), 
        index_view.end(), 
        0, 
        [&](int res, int idx) {
            return res + a.at(idx) * b.at(idx);
        }
    );
}

兼容说明

如果使用的编译器暂不支持C++20范围库,也不需要手写全功能迭代器,仅需实现一个极简的、支持operator*、operator++、operator!=的整数迭代器配合std::accumulate即可,代码量不超过10行,远低于完整自定义迭代器的实现成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:54:28