#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
struct TeamStats {
std::string name;
float yards_per_game;
int total_points;
};
using QuickSortPred = std::function<bool(const TeamStats&, const TeamStats&)>;
void quickSort(TeamStats* arr, size_t numTeams, QuickSortPred predicate)
{
/// NOTE: This is NOT a complete quicksort, it's just to demonstrate
/// the usage of predicate.
for (size_t i = 0; i < numTeams - 1; ++i) {
// before: if (arr[i] < arr[i+1])
if (predicate(arr[i], arr[i+1]))
std::swap(arr[i], arr[i+1]);
}
}
int main() {
TeamStats arr[] = {
{ "Red", 100, 30, },
{ "Blue", 150, 10, },
{ "Green", 200, 20, },
};
// approach one, store the lambda before hand
auto sortByYards = [](const TeamStats& lhs, const TeamStats& rhs) -> bool {
return lhs.yards_per_game < rhs.yards_per_game;
};
quickSort(arr, 3, sortByYards);
// approach two, write the lambda inline.
quickSort(arr, 3, [](const TeamStats& lhs, const TeamStats& rhs) -> bool {
return lhs.total_points < rhs.total_points;
});
return 0;
}
CSNpbmNsdWRlIDxhbGdvcml0aG0+CgkjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCSNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDxzdHJpbmc+CgkKCXN0cnVjdCBUZWFtU3RhdHMgewoJCXN0ZDo6c3RyaW5nIG5hbWU7CgkJZmxvYXQgeWFyZHNfcGVyX2dhbWU7CgkJaW50IHRvdGFsX3BvaW50czsKCX07CgkKCXVzaW5nIFF1aWNrU29ydFByZWQgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgVGVhbVN0YXRzJiwgY29uc3QgVGVhbVN0YXRzJik+OwoJdm9pZCBxdWlja1NvcnQoVGVhbVN0YXRzKiBhcnIsIHNpemVfdCBudW1UZWFtcywgUXVpY2tTb3J0UHJlZCBwcmVkaWNhdGUpCgl7CgkJLy8vIE5PVEU6IFRoaXMgaXMgTk9UIGEgY29tcGxldGUgcXVpY2tzb3J0LCBpdCdzIGp1c3QgdG8gZGVtb25zdHJhdGUKCQkvLy8gdGhlIHVzYWdlIG9mIHByZWRpY2F0ZS4KCQoJCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVGVhbXMgLSAxOyArK2kpIHsKCQkJLy8gYmVmb3JlOiBpZiAoYXJyW2ldIDwgYXJyW2krMV0pCgkJCWlmIChwcmVkaWNhdGUoYXJyW2ldLCBhcnJbaSsxXSkpCgkJCQlzdGQ6OnN3YXAoYXJyW2ldLCBhcnJbaSsxXSk7CgkJfQoJfQoJCgkKCWludCBtYWluKCkgewoJCVRlYW1TdGF0cyBhcnJbXSA9IHsKCQkJeyAiUmVkIiwgICAxMDAsIDMwLCB9LAoJCQl7ICJCbHVlIiwgIDE1MCwgMTAsIH0sCgkJCXsgIkdyZWVuIiwgMjAwLCAyMCwgfSwKCQl9OwoJCgkJLy8gYXBwcm9hY2ggb25lLCBzdG9yZSB0aGUgbGFtYmRhIGJlZm9yZSBoYW5kCgkJYXV0byBzb3J0QnlZYXJkcyA9IFtdKGNvbnN0IFRlYW1TdGF0cyYgbGhzLCBjb25zdCBUZWFtU3RhdHMmIHJocykgLT4gYm9vbCB7CgkJCXJldHVybiBsaHMueWFyZHNfcGVyX2dhbWUgPCByaHMueWFyZHNfcGVyX2dhbWU7CgkJfTsKCQlxdWlja1NvcnQoYXJyLCAzLCBzb3J0QnlZYXJkcyk7CgkJCgkJLy8gYXBwcm9hY2ggdHdvLCB3cml0ZSB0aGUgbGFtYmRhIGlubGluZS4KCQlxdWlja1NvcnQoYXJyLCAzLCBbXShjb25zdCBUZWFtU3RhdHMmIGxocywgY29uc3QgVGVhbVN0YXRzJiByaHMpIC0+IGJvb2wgewoJCQlyZXR1cm4gbGhzLnRvdGFsX3BvaW50cyA8IHJocy50b3RhbF9wb2ludHM7CgkJfSk7CgkKCQlyZXR1cm4gMDsKCX0=