#include "stdio.h"
#include <iostream>
#include <string>
#include <chrono>
#include <vector>
#include <map>
#include <algorithm>
using namespace std::chrono;
using namespace std;
// create vector holding desired ordering
vector<string> order({ "a", "d", "i", "n", "ns", "ne", "vl", "rr" });
// create sort function for vector of pairs
bool comparator1(const pair<string, string> &s1, const pair<string, string> &s2) {
// find() - it.begin() gives you the index number.
int a = find(order.begin(), order.end(), s1.first) - order.begin();
int b = find(order.begin(), order.end(), s2.first) - order.begin();
return a < b; // lower index < higher index
};
bool comparator2(const pair<string, string> &s1, const pair<string, string> &s2) {
// find() - it.begin() gives you the index number.
auto a = std::make_tuple(s1.first =="a", s1.first =="d", s1.first =="i", s1.first =="n", s1.first =="ns", s1.first =="ne", s1.first =="vl", s1.first =="rr");
auto b = std::make_tuple(s2.first =="a", s2.first =="d", s2.first =="i", s2.first =="n", s2.first =="ns", s2.first =="ne", s2.first =="vl", s2.first =="rr");
return a < b; // lower index < higher index
};
vector<pair<string, string>> vp ={ { "a","legato" },{ "vl","3" },{ "i", "3" },{ "rr","2" } };
void sortWithVector() {
sort(vp.begin(), vp.end(), comparator1);
}
void sortWithTuple() {
sort(vp.begin(), vp.end(), comparator2);
}
int main()
{
high_resolution_clock::time_point t1;
high_resolution_clock::time_point t2;
double duration;
t1 = high_resolution_clock::now();
for (int i=0; i < 10000; ++i) sortWithVector();
t2 = high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
cout << duration/1000.0 << "ms" << endl;
t1 = high_resolution_clock::now();
for (int i=0; i < 10000; ++i) sortWithTuple();
t2 = high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
cout << duration/1000.0 << "ms" << endl;
return 0;
}
I2luY2x1ZGUgInN0ZGlvLmgiCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIGNyZWF0ZSB2ZWN0b3IgaG9sZGluZyBkZXNpcmVkIG9yZGVyaW5nCnZlY3RvcjxzdHJpbmc+IG9yZGVyKHsgImEiLCAiZCIsICJpIiwgIm4iLCAibnMiLCAibmUiLCAidmwiLCAicnIiIH0pOwoKLy8gY3JlYXRlIHNvcnQgZnVuY3Rpb24gZm9yIHZlY3RvciBvZiBwYWlycwpib29sIGNvbXBhcmF0b3IxKGNvbnN0IHBhaXI8c3RyaW5nLCBzdHJpbmc+ICZzMSwgY29uc3QgcGFpcjxzdHJpbmcsIHN0cmluZz4gJnMyKSB7CgkvLyBmaW5kKCkgLSBpdC5iZWdpbigpIGdpdmVzIHlvdSB0aGUgaW5kZXggbnVtYmVyLiAKCWludCBhID0gZmluZChvcmRlci5iZWdpbigpLCBvcmRlci5lbmQoKSwgczEuZmlyc3QpIC0gb3JkZXIuYmVnaW4oKTsKCWludCBiID0gZmluZChvcmRlci5iZWdpbigpLCBvcmRlci5lbmQoKSwgczIuZmlyc3QpIC0gb3JkZXIuYmVnaW4oKTsKCXJldHVybiBhIDwgYjsgLy8gbG93ZXIgaW5kZXggPCBoaWdoZXIgaW5kZXgKfTsKCgoKYm9vbCBjb21wYXJhdG9yMihjb25zdCBwYWlyPHN0cmluZywgc3RyaW5nPiAmczEsIGNvbnN0IHBhaXI8c3RyaW5nLCBzdHJpbmc+ICZzMikgewoJLy8gZmluZCgpIC0gaXQuYmVnaW4oKSBnaXZlcyB5b3UgdGhlIGluZGV4IG51bWJlci4gCglhdXRvIGEgPSBzdGQ6Om1ha2VfdHVwbGUoczEuZmlyc3QgPT0iYSIsIHMxLmZpcnN0ID09ImQiLCBzMS5maXJzdCA9PSJpIiwgczEuZmlyc3QgPT0ibiIsIHMxLmZpcnN0ID09Im5zIiwgczEuZmlyc3QgPT0ibmUiLCBzMS5maXJzdCA9PSJ2bCIsIHMxLmZpcnN0ID09InJyIik7CglhdXRvIGIgPSBzdGQ6Om1ha2VfdHVwbGUoczIuZmlyc3QgPT0iYSIsIHMyLmZpcnN0ID09ImQiLCBzMi5maXJzdCA9PSJpIiwgczIuZmlyc3QgPT0ibiIsIHMyLmZpcnN0ID09Im5zIiwgczIuZmlyc3QgPT0ibmUiLCBzMi5maXJzdCA9PSJ2bCIsIHMyLmZpcnN0ID09InJyIik7CglyZXR1cm4gYSA8IGI7IC8vIGxvd2VyIGluZGV4IDwgaGlnaGVyIGluZGV4Cn07CgoKCnZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gdnAgPXsgeyAiYSIsImxlZ2F0byIgfSx7ICJ2bCIsIjMiIH0seyAiaSIsICIzIiB9LHsgInJyIiwiMiIgfSB9OwoKdm9pZCBzb3J0V2l0aFZlY3RvcigpIHsKCXNvcnQodnAuYmVnaW4oKSwgdnAuZW5kKCksIGNvbXBhcmF0b3IxKTsKfQoKdm9pZCBzb3J0V2l0aFR1cGxlKCkgewoJc29ydCh2cC5iZWdpbigpLCB2cC5lbmQoKSwgY29tcGFyYXRvcjIpOwp9CgppbnQgbWFpbigpCnsKCWhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MTsKCWhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MjsKCWRvdWJsZSBkdXJhdGlvbjsKCQoJCgkKCQoJdDEgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwoJCglmb3IgKGludCBpPTA7IGkgPCAxMDAwMDsgKytpKSBzb3J0V2l0aFZlY3RvcigpOwoJCgl0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CglkdXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KCB0MiAtIHQxICkuY291bnQoKTsKCWNvdXQgPDwgZHVyYXRpb24vMTAwMC4wICA8PCAibXMiIDw8IGVuZGw7CgkKCQoJCgkKCXQxID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCQoJZm9yIChpbnQgaT0wOyBpIDwgMTAwMDA7ICsraSkgc29ydFdpdGhUdXBsZSgpOwoJCgl0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICBkdXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KCB0MiAtIHQxICkuY291bnQoKTsKICAgIGNvdXQgPDwgZHVyYXRpb24vMTAwMC4wICA8PCAibXMiIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=