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
相关产品推荐
相关产品推荐

