當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ transform_inclusive_scan()用法及代碼示例


transform_inclusive_scan()是C++中的內置函數,與inclusive_scan()相同,不同之處在於一元函數首先應用於每個輸入項。
它的函數是使用unary_op在first和last之間轉換每個元素,然後在binary_op的幫助下計算具有特定範圍的包含和運算。 i-th求和運算中包含一個包含在內的定義的i-th輸入元素。我們可以采用一個可選的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:-如果要提供init(initial val),將對unary_op的結果和其他binary_op的結果進行操作。

類型要求:

    • 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 <iostream> 
    #include <vector> 
    using namespace std; 
      
    namespace geeksInputIterator { 
    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) 
    { 
        *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<int> InputVector{ 11, 22, 33, 44, 55, 66, 77, 88 }; 
      
        // OutputVector elements size 
        vector<int> 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上運行。



相關用法


注:本文由純淨天空篩選整理自jit_t大神的英文原創作品 transform_inclusive_scan() function in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。