#include <algorithm>
#include <ctime>
#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

vector<int> createArrays() {
	vector<int> result(rand() % 13);

	generate(result.begin(), result.end(), rand);

	return result;
}

vector<int> test1(const vector<int>& testValues1, const vector<int>& testValues2) {
	vector<int> result(testValues1.size() * testValues2.size());

	for_each(begin(result), end(result), [&, it = 0U](auto& i) mutable {
		i = testValues1[it / testValues2.size()] + testValues2[it % testValues2.size()];
		++it;
	});

	return result;
}

vector<int> test2(const vector<int>& testValues1, const vector<int>& testValues2) {
	vector<int> result(testValues1.size() * testValues2.size());
	auto i = begin(result);

	std::for_each(cbegin(testValues1), cend(testValues1), [&](const auto& A) { std::for_each(cbegin(testValues2), cend(testValues2), [&](const auto& B) { *i++ = A + B; }); });
	return result;
}


int main() {
	clock_t start;
	clock_t total1 = 0;
	clock_t total2 = 0;
	auto first = &test1;
	auto second = &test2;

	srand(static_cast<unsigned int>(time(nullptr)));

	for (auto i = 0; i < 100; ++i) {
		auto testValues1 = createArrays();
		auto testValues2 = createArrays();

		start = clock();
		const auto result1 = first(testValues1, testValues2);
		total1 += clock() - start;

		start = clock();
		const auto result2 = second(testValues1, testValues2);
		total2 += clock() - start;

		if (!equal(cbegin(result1), cend(result1), cbegin(result2), cend(result2))) {
			cout << "MISMATCH\n";
			break;
		}

		swap(total1, total2);
		swap(first, second);
	}
	cout << "Test1: " << total1 << endl << "Test2: " << total2 << endl;
}