きままにブログ

プログラミングを主とした私のメモ帳です。寂しいのでコメントください笑

コンテナ要素に並列アクセスで初期化したいとき

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;
}