#include <algorithm>
#include <ctime>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>
using namespace std;
vector<string> createArrays() {
vector<string> result(rand() % 100);
generate(result.begin(), result.end(), []() {
std::string ret;
for(int i=0; i<32; ++i) {
ret.push_back(rand()%26+'a');
}
return ret;
});
return result;
}
vector<string> test1(const vector<string>& testValues1, const vector<string>& testValues2) {
vector<string> 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<string> test2(const vector<string>& testValues1, const vector<string>& testValues2) {
vector<string> 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 < 10; ++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;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8c3RyaW5nPiBjcmVhdGVBcnJheXMoKSB7Cgl2ZWN0b3I8c3RyaW5nPiByZXN1bHQocmFuZCgpICUgMTAwKTsKCglnZW5lcmF0ZShyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpLCBbXSgpIHsKCQlzdGQ6OnN0cmluZyByZXQ7CgkJZm9yKGludCBpPTA7IGk8MzI7ICsraSkgewoJCQlyZXQucHVzaF9iYWNrKHJhbmQoKSUyNisnYScpOwoJCX0KCQlyZXR1cm4gcmV0OwoJfSk7CgoJcmV0dXJuIHJlc3VsdDsKfQoKdmVjdG9yPHN0cmluZz4gdGVzdDEoY29uc3QgdmVjdG9yPHN0cmluZz4mIHRlc3RWYWx1ZXMxLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdGVzdFZhbHVlczIpIHsKCXZlY3RvcjxzdHJpbmc+IHJlc3VsdCh0ZXN0VmFsdWVzMS5zaXplKCkgKiB0ZXN0VmFsdWVzMi5zaXplKCkpOwoKCWZvcl9lYWNoKGJlZ2luKHJlc3VsdCksIGVuZChyZXN1bHQpLCBbJiwgaXQgPSAwVV0oYXV0byYgaSkgbXV0YWJsZSB7CgkJaSA9IHRlc3RWYWx1ZXMxW2l0IC8gdGVzdFZhbHVlczIuc2l6ZSgpXSArIHRlc3RWYWx1ZXMyW2l0ICUgdGVzdFZhbHVlczIuc2l6ZSgpXTsKCQkrK2l0OwoJfSk7CgoJcmV0dXJuIHJlc3VsdDsKfQoKdmVjdG9yPHN0cmluZz4gdGVzdDIoY29uc3QgdmVjdG9yPHN0cmluZz4mIHRlc3RWYWx1ZXMxLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdGVzdFZhbHVlczIpIHsKCXZlY3RvcjxzdHJpbmc+IHJlc3VsdCh0ZXN0VmFsdWVzMS5zaXplKCkgKiB0ZXN0VmFsdWVzMi5zaXplKCkpOwoJYXV0byBpID0gYmVnaW4ocmVzdWx0KTsKCglzdGQ6OmZvcl9lYWNoKGNiZWdpbih0ZXN0VmFsdWVzMSksIGNlbmQodGVzdFZhbHVlczEpLCBbJl0oY29uc3QgYXV0byYgQSkgeyBzdGQ6OmZvcl9lYWNoKGNiZWdpbih0ZXN0VmFsdWVzMiksIGNlbmQodGVzdFZhbHVlczIpLCBbJl0oY29uc3QgYXV0byYgQikgeyAqaSsrID0gQSArIEI7IH0pOyB9KTsKCXJldHVybiByZXN1bHQ7Cn0KCgppbnQgbWFpbigpIHsKCWNsb2NrX3Qgc3RhcnQ7CgljbG9ja190IHRvdGFsMSA9IDA7CgljbG9ja190IHRvdGFsMiA9IDA7CglhdXRvIGZpcnN0ID0gJnRlc3QxOwoJYXV0byBzZWNvbmQgPSAmdGVzdDI7CgoJc3JhbmQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih0aW1lKG51bGxwdHIpKSk7CgoJZm9yIChhdXRvIGkgPSAwOyBpIDwgMTA7ICsraSkgewoJCWF1dG8gdGVzdFZhbHVlczEgPSBjcmVhdGVBcnJheXMoKTsKCQlhdXRvIHRlc3RWYWx1ZXMyID0gY3JlYXRlQXJyYXlzKCk7CgoJCXN0YXJ0ID0gY2xvY2soKTsKCQljb25zdCBhdXRvIHJlc3VsdDEgPSBmaXJzdCh0ZXN0VmFsdWVzMSwgdGVzdFZhbHVlczIpOwoJCXRvdGFsMSArPSBjbG9jaygpIC0gc3RhcnQ7CgoJCXN0YXJ0ID0gY2xvY2soKTsKCQljb25zdCBhdXRvIHJlc3VsdDIgPSBzZWNvbmQodGVzdFZhbHVlczEsIHRlc3RWYWx1ZXMyKTsKCQl0b3RhbDIgKz0gY2xvY2soKSAtIHN0YXJ0OwoKCQlpZiAoIWVxdWFsKGNiZWdpbihyZXN1bHQxKSwgY2VuZChyZXN1bHQxKSwgY2JlZ2luKHJlc3VsdDIpLCBjZW5kKHJlc3VsdDIpKSkgewoJCQljb3V0IDw8ICJNSVNNQVRDSFxuIjsKCQkJYnJlYWs7CgkJfQoKCQlzd2FwKHRvdGFsMSwgdG90YWwyKTsKCQlzd2FwKGZpcnN0LCBzZWNvbmQpOwoJfQoJY291dCA8PCAiVGVzdDE6ICIgPDwgdG90YWwxIDw8IGVuZGwgPDwgIlRlc3QyOiAiIDw8IHRvdGFsMiA8PCBlbmRsOwp9