inner_product结果错误的主因是右区间长度不足却未被检查;它仅验证左区间结束,若first2+(last1-first1)超出右容器边界,将导致越界访问、未定义行为。

直接用 std::inner_product 最省事,但不注意迭代器范围或自定义二元操作时,结果会错得毫无征兆。
inner_product 算出来是错的?
常见错误不是函数不会用,而是传了不等长的区间——它只检查左区间的结束,不校验右区间是否够长。一旦 first2 起始位置 + (last1 - first1) 超出右容器边界,行为未定义。
vector<int> a = {1,2,3}, b = {4,5}</int>,调用 inner_product(a.begin(), a.end(), b.begin(), 0) → 读 b[2],越界访问distance(first1, last1) inner_product 的两个重载怎么选?标准库提供两套签名,区别在是否自定义运算:
inner_product(first1, last1, first2, init) 用 operator+ 累加,operator* 做元素乘法inner_product(first1, last1, first2, init, binary_op1, binary_op2) 第一个操作符替代累加(如换成 std::min),第二个替代乘法(如换成 std::plus)init 类型必须和 binary_op1 返回类型兼容,否则编译失败
示例:求向量夹角余弦需先算模长,可写成 inner_product(a.begin(), a.end(), a.begin(), 0.0, std::plus(), std::multiplies()) 得到平方和。
inner_product 是 constexpr 且通常内联,性能不输手写循环,但有隐式转换陷阱:
init 是 int,而向量元素是 double,乘法结果会被截断为 int 再累加init 类型,比如点积用 0.0 或 0.0f,避免整数溢出std::valarray 或原生数组同样适用,只要迭代器满足前向要求
真正容易被忽略的是:它不验证右区间长度,也不做任何类型检查——你给它两个 int* 和一个 size_t 初始值,它就真按 size_t 算,哪怕中间乘法早溢出了。
版权声明: 本站资源均来自互联网或会员发布,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!联系QQ:76900276