コンテナ要素に並列アクセスで初期化したいとき
std::transformのbinary operationの使い方:
array<int, 3> a1 = { 1, 2, 3 }; array<int, 3> a2 = { 4, 5, 6 }; array<int, 3> a3; std::transform(a1.begin(), a1.end(), a2.begin(), a3.begin(), [](const int a, const int b) { return a * b; }); for(const auto it : a3) { printf("%d, ", it); }
a1, a2を与えて(|a1|<|a2|とする)、a3(|a1|<|a3|とする)を2つの要素を以て初期化する。
そんな感じで並列に処理するfor_eachを作った。
#include <cstdio> #include <array> #include <algorithm> using std::array; template <typename S, typename T, typename Func> void para_for_each(S& s, T& t, Func f) { for(auto it_s = s.begin(), it_t = t.begin(); it_s != s.end(); ++it_s, ++it_t) { f(*it_s, *it_t); } } int main() { array<int, 3> a1; array<int, 3> a2; para_for_each(a1, a2, [](int& a, int& b) { static int i = 0; a = i; b = i * 2; ++i; }); const auto view = [](const int it) { printf("%d, ", it); }; printf("\na1 = "); std::for_each(a1.begin(), a1.end(), view); printf("\na2 = "); std::for_each(a2.begin(), a2.end(), view); getchar(); return 0; }