std::inner_product - cppreference.com
提供: cppreference.com
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
| ヘッダ |
||
| (1) | ||
|
|
(C++20未満) | |
|
|
(C++20以上) | |
| (2) | ||
|
|
(C++20未満) | |
|
|
(C++20以上) | |
範囲 [first1, last1) および first2 から始まる範囲の内積 (積の和) の計算、または順序付けされた map/reduce 操作を行います。
1) 累積変数 acc を初期値 init で初期化し、 last1 に達するまで、
|
それを式 |
(C++20未満) |
|
それを式 |
(C++20以上) |
+ および * の組み込みの意味の場合、これは2つの範囲の内積を計算します。
2) 累積変数 acc を初期値 init で初期化し、 last1 に達するまで、
|
それを式 |
(C++20未満) |
|
それを式 |
(C++20以上) |
|
|
(C++11未満) |
|
|
(C++11以上) |
引数
| first1, last1 | - | 1つめの要素の範囲 |
| first2 | - | 2つめの要素の範囲の先頭 |
| init | - | 積を加算する初期値 |
| op1 | - | 適用される二項演算関数オブジェクト。 この「加算」関数は、 op2 から返された値と、累積変数の現在の値を取り、累積変数に格納される新しい値を生成します。
関数のシグネチャは以下と同等であるべきです。
シグネチャが |
| op2 | - | 適用される二項演算関数オブジェクト。 この「乗算」関数は、それぞれの範囲から値を1つずつ取り、新しい値を生成します。
関数のシグネチャは以下と同等であるべきです。
シグネチャが |
| 型の要件 | ||
-InputIt1, InputIt2 は LegacyInputIterator の要件を満たさなければなりません。
| ||
-ForwardIt1, ForwardIt2 は LegacyForwardIterator の要件を満たさなければなりません。
| ||
-T は CopyAssignable および CopyConstructible の要件を満たさなければなりません。
| ||
戻り値
上で説明した通りの acc の最終値。
実装例
| 1つめのバージョン |
|---|
template<class InputIt1, class InputIt2, class T> constexpr // since C++20 T inner_product(InputIt1 first1, InputIt1 last1, InputIt2 first2, T init) { while (first1 != last1) { init = std::move(init) + *first1 * *first2; // std::move since C++20 ++first1; ++first2; } return init; } |
| 2つめのバージョン |
template<class InputIt1, class InputIt2, class T, class BinaryOperation1, class BinaryOperation2> constexpr // since C++20 T inner_product(InputIt1 first1, InputIt1 last1, InputIt2 first2, T init, BinaryOperation1 op1 BinaryOperation2 op2) { while (first1 != last1) { init = op1(std::move(init), op2(*first1, *first2)); // std::move since C++20 ++first1; ++first2; } return init; } |
ノート
このアルゴリズムの並列化バージョン std::transform_reduce では、 op1 および op2 が交換法則と結合法則を満たすことが要求されますが、 std::inner_product にはそのような要件はなく、常に指定された順序で演算を行います。
例
#include <numeric> #include <iostream> #include <vector> #include <functional> int main() { std::vector<int> a{0, 1, 2, 3, 4}; std::vector<int> b{5, 4, 2, 3, 1}; int r1 = std::inner_product(a.begin(), a.end(), b.begin(), 0); std::cout << "Inner product of a and b: " << r1 << '\n'; int r2 = std::inner_product(a.begin(), a.end(), b.begin(), 0, std::plus<>(), std::equal_to<>()); std::cout << "Number of pairwise matches between a and b: " << r2 << '\n'; }
出力:
Inner product of a and b: 21 Number of pairwise matches between a and b: 2