📜  C++中的std :: inner_product

📅  最后修改于: 2021-05-30 12:17:54             🧑  作者: Mango

计算范围的累积内积
返回以从first1和first2开始的两个范围的元素形成的对的内积对init进行累加的结果。

可以使用参数binary_op1和binary_op2覆盖这两个默认操作(以求和乘对的总和)。

1.使用默认的inner_product:
句法:

Template :
T inner_product (InputIterator1 first1, InputIterator1 last1,
                 InputIterator2 first2, T init);

Parameters :

first1, last1
Input iterators to the initial and final positions in the first
sequence.

first2
Input iterator to the initial position in the second sequence.
The range starts at first2 and has as many elements as the range
above [first1, last1].

init
Initial value for the accumulator.

Neither operations shall modify any of the elements passed as
its arguments.

Return Type :
The result of accumulating init and the products of all the pairs
of elements in the ranges starting at first1 and first2.
// CPP program to illustrate
// std :: inner_product
#include  // std::cout
#include  // std::minus, std::divides
#include  // std::inner_product
  
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 100;
    int series1[] = { 10, 20, 30 };
    int series2[] = { 1, 2, 3 };
    int n = sizeof(series1) / sizeof(series1[0]);
  
    // Elements in series1
    std::cout << "First array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
  
    // Elements in series2
    std::cout << "Second array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
  
    std::cout << "Using default inner_product: ";
    std::cout << std::inner_product(series1, series1 + n, series2, init);
    std::cout << '\n';
  
    return 0;
}

输出:

First array contains : 10 20 30
Second array contains : 1 2 3

Using default inner_product: 240

2.使用功能操作:
句法:

Template :
T inner_product (InputIterator1 first1, InputIterator1 last1,
                 InputIterator2 first2, T init,
                 BinaryOperation1 binary_op1,
                 BinaryOperation2 binary_op2);

Parameters :

first1, last1, first2, init are same as above.

binary_op1
Binary operation taking two elements of type T as arguments, and
returning the result of an accumulation operation.
This can either be a function pointer or a function object.

binary_op2
Binary operation taking two elements of type T as arguments, and
returning the result of the inner product operation.
This can either be a function pointer or a function object.

Here binary_op1 and binary_op2 are functional operation.

Neither operations shall modify any of the elements passed as
its arguments.

Return Type :
The result of accumulating init and the products of all the pairs
of elements in the ranges starting at first1 and first2.
// CPP program to illustrate
// std :: inner_product
#include  // std::cout
#include  // std::minus, std::divides
#include  // std::inner_product
  
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 100;
    int series1[] = { 10, 20, 30 };
    int series2[] = { 1, 2, 3 };
    int n = sizeof(series1) / sizeof(series1[0]);
  
    // Elements in series1
    std::cout << "First array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
  
    // Elements in series2
    std::cout << "Second array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
  
    std::cout << "Using functional operations: ";
    // std :: minus returns the difference b/w
    // each elements of both array
    // std :: divides return the quotient of
    // each elements of both array after performing
    // divide operation
    // The operations is performed b/w number of same index
    // of both array
    std::cout << std::inner_product(series1, series1 + n, series2, init,
                                    std::minus(), std::divides());
    std::cout << '\n';
  
    return 0;
}

输出:

First array contains : 10 20 30
Second array contains : 1 2 3

Using functional operations: 70

3.使用自定义功能:
句法:

Template :
T inner_product (InputIterator1 first1, InputIterator1 last1,
                 InputIterator2 first2, T init,
                 BinaryOperation1 binary_op1,
                 BinaryOperation2 binary_op2);

Parameters :

first1, last1, first2, init are same as above.

binary_op1
Binary operation taking two elements of type T as arguments, and
returning the result of an accumulation operation.
This can either be a function pointer or a function object.

binary_op2
Binary operation taking two elements of type T as arguments, and
returning the result of the inner product operation.
This can either be a function pointer or a function object.

Neither operations shall modify any of the elements passed as
its arguments.

Return Type :
The result of accumulating init and the products of all the pairs
of elements in the ranges starting at first1 and first2.
// CPP program to illustrate
// std :: inner_product
#include  // std::cout
#include  // std::minus, std::divides
#include  // std::inner_product
  
// Custom funcitons
int myaccumulator(int x, int y)
{
    return x - y;
}
int myproduct(int x, int y)
{
    return x + y;
}
  
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 100;
    int series1[] = { 10, 20, 30 };
    int series2[] = { 1, 2, 3 };
    int n = sizeof(series1) / sizeof(series1[0]);
  
    // Elements in series1
    std::cout << "First array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
  
    // Elements in series2
    std::cout << "Second array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
  
    std::cout << "Using custom functions: ";
    std::cout << std::inner_product(series1, series1 + 3, series2, init,
                                    myaccumulator, myproduct);
    std::cout << '\n';
  
    return 0;
}

输出:

First array contains : 10 20 30
Second array contains : 1 2 3

Using custom functions: 34

笔记 :
通过使用函数值自定义函数,我们可以通过在此STL函数更改运算符(或使用其他函数值)来执行操作。

可能的应用:它返回以从first1和first2开始的两个范围的元素形成的对的内积对init进行累加的结果。

1.可用于查找两个数组的第i个索引的乘积和。
例如:
阵列1:1 2 3 4
数组2:10 20 30 40

产品总数:300

说明: 1 * 10 + 2 * 20 + 3 * 30 + 4 * 40 = 300

// CPP program to illustrate
// std :: inner_product
#include  // std::cout
#include  // std::minus, std::divides
#include  // std::inner_product
  
// Custom funcitons
int myaccumulator(int x, int y)
{
    return x + y;
}
int myproduct(int x, int y)
{
    return x * y;
}
  
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 0;
    int series1[] = { 1, 2, 3, 4 };
    int series2[] = { 10, 20, 30, 40 };
    int n = sizeof(series1) / sizeof(series1[0]);
  
    // Elements in series1
    std::cout << "Array 1 :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
  
    // Elements in series2
    std::cout << "Array 2 :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
  
    std::cout << "Sum of products : ";
    std::cout << std::inner_product(series1, series1 + n, series2, init,
                                    myaccumulator, myproduct);
    std::cout << '\n';
  
    return 0;
}

输出 :

Array 1 : 1 2 3 4
Array 2 : 10 20 30 40

Sum of products : 300

我们还可以通过更改运算符来找到乘积之差,或的总和,或除的差等等。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”