#include #include #include #include #include #include struct Record { std::string name; int score; int points() const { return score; } }; int main() { const std::vector input{{"Bea", 4}, {"Ari", 4}, {"Cy", 2}}; std::vector ranked; std::transform(input.begin(), input.end(), std::back_inserter(ranked), [](const Record& r) { return Record{r.name, r.score + 1}; }); const auto before = [](const Record& a, const Record& b) { if (a.score != b.score) return a.score > b.score; return a.name < b.name; }; std::sort(ranked.begin(), ranked.end(), before); assert(ranked[0].name == "Ari" && ranked[1].name == "Bea"); assert(!before(ranked[0], ranked[0])); assert(input[0].score == 4 && ranked[0].score == 5); auto last = ranked.rbegin(); assert(last.base() == ranked.end()); assert(last->name == "Cy"); std::vector scores; const auto points = std::mem_fn(&Record::points); std::for_each(ranked.begin(), ranked.end(), [&](const Record& r) { scores.push_back(points(r)); }); assert((scores == std::vector{5, 5, 3})); const auto found = std::find_if(ranked.begin(), ranked.end(), [](const Record& r) { return r.name == "Bea"; }); assert(found != ranked.end()); assert(std::invoke(&Record::points, *found) == 5); }