📅  最后修改于: 2023-12-03 15:14:02.874000             🧑  作者: Mango
在C++中, std::inner_product
是一个函数模板,用于计算两个迭代器范围内元素的乘积总和,并加上初始值,因此它可以计算内积。
以下是 std::inner_product
函数模板的语法:
template< class InputIt1, class InputIt2, class T >
T inner_product( InputIt1 first1, InputIt1 last1, InputIt2 first2, T init );
template< class InputIt1, class InputIt2, class T, class BinaryOperation1, class BinaryOperation2 >
T inner_product( InputIt1 first1, InputIt1 last1, InputIt2 first2, T init, BinaryOperation1 op1, BinaryOperation2 op2 );
第一个参数和第二个参数是两个迭代器,指定一个范围。第三个参数是第二个范围的首个元素。
第一个函数版本接受一个初始值 init,它将被添加到内积中。
第二个函数版本还接受两个二元函数对象 op1 和 op2。这些将用于执行特定运算。
如果两个范围的长度不匹配,则行为未指定。
下面是一个简单的示例,使用 std::inner_product
函数计算两个向量的内积。
#include <iostream>
#include <numeric>
#include <vector>
int main()
{
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {4, 5, 6};
int result = std::inner_product(v1.begin(), v1.end(), v2.begin(), 0);
std::cout << "The inner product of v1 and v2 is: " << result << std::endl;
return 0;
}
输出:
The inner product of v1 and v2 is: 32
在此示例中,函数调用计算:
$$1 \times 4 + 2 \times 5 + 3 \times 6 + 0 = 32$$
这是两个向量的内积(点积)。
我们可以使用自定义函数对象对元素进行乘法和加法计算。
struct Multiply {
template<typename T1, typename T2>
auto operator()(const T1& t1, const T2& t2) const { return t1 * t2; }
};
struct Add {
template<typename T1, typename T2>
auto operator()(const T1& t1, const T2& t2) const { return t1 + t2; }
};
int main()
{
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {4, 5, 6};
int result = std::inner_product(v1.begin(), v1.end(), v2.begin(), 0, Add{}, Multiply{});
std::cout << "The inner product of v1 and v2 is: " << result << std::endl;
return 0;
}
输出与之前相同:
The inner product of v1 and v2 is: 32
在此示例中,我们使用了自定义的两个函数对象来执行加法和乘法运算。这些函数对象将在内部通过函数调用进行调用。
如果您在遇到需要计算内积时,请首先考虑使用 std::inner_product
函数。它可以显着减少代码量并提高代码可读性。