#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <string>

using namespace std;

int main() {
	const auto cmp1 = [ordering = { "dog"s, "cat"s, "mouse"s, "elephant"s }](const string& lhs, const string& rhs) { return find(cbegin(ordering), cend(ordering), lhs) < find(cbegin(ordering), cend(ordering), rhs); };
	const auto cmp2 = [ordering = { "dog", "cat", "mouse", "elephant" }](const string& lhs, const string& rhs) { return find(cbegin(ordering), cend(ordering), lhs) < find(cbegin(ordering), cend(ordering), rhs); };

	map<string, int, function<bool(const string&, const string&)>> myMap1(cmp1);

	myMap1["cat"s] = 1;
	myMap1["dog"s] = 2;
	myMap1["elephant"s] = 3;
	myMap1["mouse"s] = 4;
	myMap1["rhino"s] = 5;

    cout << "Wrong:\n";

	for (auto& i : myMap1) {
		cout << '\t' << i.first << ' ' << i.second << endl;
	}
	
	map<string, int, function<bool(const string&, const string&)>> myMap2(cmp2);

	myMap2["cat"s] = 1;
	myMap2["dog"s] = 2;
	myMap2["elephant"s] = 3;
	myMap2["mouse"s] = 4;
	myMap2["rhino"s] = 5;
	
	cout << "Right:\n";

	for (auto& i : myMap2) {
		cout << '\t' << i.first << ' ' << i.second << endl;
	}	
}