#include <map>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e4 + 1;
vector<int> v(N);
vector<int> sorted(N);
map<int, int> counts;
long long start;
void startClock() {
start = clock();
}
void stopClock() {
cout << float( clock () - start ) / CLOCKS_PER_SEC << endl;
}
void copyOriginal() {
for (int i = 0; i < N; ++i)
sorted[i] = v[i];
}
void sortWLambda(map<int, int>& counts) {
cout << "sorting with lambda" << endl;
sort(sorted.begin(), sorted.end(), [&counts](const int& a, const int& b) {
if (*counts.find(a) != *counts.find(b)) return *counts.find(a) < *counts.find(b);
return a < b;
});
}
bool comparator(const int& a, const int& b) {
if (*counts.find(a) != *counts.find(b)) return *counts.find(a) < *counts.find(b);
return a < b;
}
void sortWoLambda() {
cout << "sorting w/o lambda" << endl;
sort(sorted.begin(), sorted.end(), comparator);
}
int main() {
for (int i = 0; i < N; ++i) {
int num = rand() % 1234;
counts[num]++;
v[i] = num;
}
copyOriginal();
startClock();
sortWLambda(counts);
stopClock();
copyOriginal();
startClock();
sortWoLambda();
stopClock();
return 0;
}
ICAgICNpbmNsdWRlIDxtYXA+CiAgICAjaW5jbHVkZSA8dmVjdG9yPgogICAgI2luY2x1ZGUgPGlvc3RyZWFtPgogICAgI2luY2x1ZGUgPGFsZ29yaXRobT4KICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CgogICAgY29uc3QgaW50IE4gPSAxZTQgKyAxOwogICAgdmVjdG9yPGludD4gdihOKTsKICAgIHZlY3RvcjxpbnQ+IHNvcnRlZChOKTsKICAgIG1hcDxpbnQsIGludD4gY291bnRzOwogICAgbG9uZyBsb25nIHN0YXJ0OwoKICAgIHZvaWQgc3RhcnRDbG9jaygpIHsKICAgICAgICBzdGFydCA9IGNsb2NrKCk7CiAgICB9CgogICAgdm9pZCBzdG9wQ2xvY2soKSB7CiAgICAgICAgY291dCA8PCBmbG9hdCggY2xvY2sgKCkgLSBzdGFydCApIC8gIENMT0NLU19QRVJfU0VDIDw8IGVuZGw7CiAgICB9CgogICAgdm9pZCBjb3B5T3JpZ2luYWwoKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpCiAgICAgICAgICAgIHNvcnRlZFtpXSA9IHZbaV07CiAgICB9CgogICAgdm9pZCBzb3J0V0xhbWJkYShtYXA8aW50LCBpbnQ+JiBjb3VudHMpIHsKICAgICAgICBjb3V0IDw8ICJzb3J0aW5nIHdpdGggbGFtYmRhIiA8PCBlbmRsOwogICAgICAgIHNvcnQoc29ydGVkLmJlZ2luKCksIHNvcnRlZC5lbmQoKSwgWyZjb3VudHNdKGNvbnN0IGludCYgYSwgY29uc3QgaW50JiBiKSB7CiAgICAgICAgICAgIGlmICgqY291bnRzLmZpbmQoYSkgIT0gKmNvdW50cy5maW5kKGIpKSByZXR1cm4gKmNvdW50cy5maW5kKGEpIDwgKmNvdW50cy5maW5kKGIpOwogICAgICAgICAgICByZXR1cm4gYSA8IGI7CiAgICAgICAgfSk7CiAgICB9CgogICAgYm9vbCBjb21wYXJhdG9yKGNvbnN0IGludCYgYSwgY29uc3QgaW50JiBiKSB7CiAgICAgICAgaWYgKCpjb3VudHMuZmluZChhKSAhPSAqY291bnRzLmZpbmQoYikpIHJldHVybiAqY291bnRzLmZpbmQoYSkgPCAqY291bnRzLmZpbmQoYik7CiAgICAgICAgcmV0dXJuIGEgPCBiOwogICAgfQoKICAgIHZvaWQgc29ydFdvTGFtYmRhKCkgewogICAgICAgIGNvdXQgPDwgInNvcnRpbmcgdy9vIGxhbWJkYSIgPDwgZW5kbDsKICAgICAgICBzb3J0KHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCksIGNvbXBhcmF0b3IpOwogICAgfQoKICAgIGludCBtYWluKCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CiAgICAgICAgICAgIGludCBudW0gPSByYW5kKCkgJSAxMjM0OwogICAgICAgICAgICBjb3VudHNbbnVtXSsrOwogICAgICAgICAgICB2W2ldID0gbnVtOwogICAgICAgIH0KCiAgICAgICAgY29weU9yaWdpbmFsKCk7CiAgICAgICAgc3RhcnRDbG9jaygpOwogICAgICAgIHNvcnRXTGFtYmRhKGNvdW50cyk7CiAgICAgICAgc3RvcENsb2NrKCk7CgogICAgICAgIGNvcHlPcmlnaW5hbCgpOwogICAgICAgIHN0YXJ0Q2xvY2soKTsKICAgICAgICBzb3J0V29MYW1iZGEoKTsKICAgICAgICBzdG9wQ2xvY2soKTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9