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上運行。
相關用法
- C++ fma()用法及代碼示例
- C++ div()用法及代碼示例
- C++ log()用法及代碼示例
- C++ array get()用法及代碼示例
- C++ array at()用法及代碼示例
- C++ strtol()用法及代碼示例
- C++ iswxdigit()用法及代碼示例
- C++ towlower()用法及代碼示例
- C++ iswalpha()用法及代碼示例
- C++ iswspace()用法及代碼示例
注:本文由純淨天空篩選整理自jit_t大神的英文原創作品 transform_inclusive_scan() function in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。