📜  C++中的transform_inclusive_scan()函数

📅  最后修改于: 2021-05-30 13:46:01             🧑  作者: Mango

transform_inclusive_scan()是C++中的内置函数,与inclusive_scan()相同,只是一元函数首先应用于每个输入项。
它的功能是使用unary_op在first和last之间转换每个元素,然后在binary_op的帮助下计算具有特定范围的前缀和运算。第i个求和运算中包括一个包含式定义的第i个输入元素。
我们可以采用一个可选的init(初始值)并将结果写到以d_first开始的范围内。

句法:

template < class InputItrator, class OutputItrator,
          class BinaryOperation, class UnaryOperation >

OutputItrator transform_inclusive_scan( InputItrator first, 
                                        InputItrator last,
                                        OutputItrator d_first,
                                        BinaryOperation binary_op,
                                        UnaryOperation unary_op 
                                     );

使用的参数:

  • first和last:-第一个和最后一个元素定义元素sum的范围。
  • d_first:-目标范围的开始。
  • unary_op:-要在输入范围内的每个元素上应用的操作。
  • binary_op:-将应用于unary_op的结果和其他binary_op的结果的操作,以及是否将提供init(initial val)。

类型要求:

    • InputItrator :Inputiterator是一个Iterator的类,它能够从指向的元素读取。如果我递增一次,则所有其他副本将失效,并且其有效性对于单遍算法。
    • OutputItrator :OutputIterator是一个Iterator,可以将其写入指向的元素。

    返回值:对最后写入的元素之后的元素的迭代器。

    注意: unary_op在此函数是可选的,不适用于init。实际上,init参数最后出现。

    以下是上述问题的实现。

    // C++ program by used std::transform_inclusive_scan() funtcion
    // to transforms each and every elements between first
    // and last with unary_op, then computes an inclusive prefix sum
    #include 
    #include 
    using namespace std;
      
    namespace geeksInputIterator {
    template 
      
    OutputItrator transform_inclusive_scan(InputItrator first,
                                           InputItrator last,
                                           OutputItrator d_first,
                                           BinaryOperation binary_op,
                                           UnaryOperation unary_op)
    {
        *d_first = unary_op(*first);
        first++;
        d_first++;
        for (auto it = first; it != last; it++) {
      
            // calculate the prefix sum
            *d_first = binary_op(unary_op(*it), *(d_first - 1));
            d_first++;
        }
        return d_first;
    }
    }
      
    // Driver code
    int main()
    {
        // input elements
        vector InputVector{ 11, 22, 33, 44, 55, 66, 77, 88 };
      
        // OutputVector elements size
        vector OutputVector(8);
      
        // inclusive tranform function with begin and ending
        geeksInputIterator::transform_inclusive_scan(InputVector.begin(),
                       InputVector.end(), OutputVector.begin(),
                       [](auto xx, auto yy) {
                         return xx + yy;
                          },
                       [](auto xx) {
                         return xx * xx;
    });
        // for loop for print output
        for (auto item : OutputVector) {
      
            // Print the output item
            cout << item << " ";
        }
      
        // to move next line
        cout << std::endl;
        return 0;
    }
    

    输出:

121 605 1694 3630 6655 11011 16940 24684 

注意:上面的程序可能无法在许多IDE上运行。

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