#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&)>;
template<typename I>
void quickSort(I begin, I end, QuickSortPred predicate)
{
/// NOTE: This is NOT a complete quicksort, it's just to demonstrate
/// the usage of predicate.
std::sort(begin, end, predicate);
}
int main() {
std::vector<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.begin(), arr.end(), sortByYards);
std::cout << "By yards:\n";
for (auto& it : arr) {
std::cout << it.yards_per_game << " " << it.name << "\n";
}
// approach two, write the lambda inline.
quickSort(arr.begin(), arr.end(), [](const TeamStats& lhs, const TeamStats& rhs) -> bool {
return lhs.total_points < rhs.total_points;
});
std::cout << "By points:\n";
for (auto& it : arr) {
std::cout << it.total_points << " " << it.name << "\n";
}
return 0;
}
CSNpbmNsdWRlIDxhbGdvcml0aG0+CgkjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCSNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDxzdHJpbmc+CgkKCXN0cnVjdCBUZWFtU3RhdHMgewoJCXN0ZDo6c3RyaW5nIG5hbWU7CgkJZmxvYXQgeWFyZHNfcGVyX2dhbWU7CgkJaW50IHRvdGFsX3BvaW50czsKCX07CgkKCXVzaW5nIFF1aWNrU29ydFByZWQgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgVGVhbVN0YXRzJiwgY29uc3QgVGVhbVN0YXRzJik+OwoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBJPgoJdm9pZCBxdWlja1NvcnQoSSBiZWdpbiwgSSBlbmQsIFF1aWNrU29ydFByZWQgcHJlZGljYXRlKQoJewoJCS8vLyBOT1RFOiBUaGlzIGlzIE5PVCBhIGNvbXBsZXRlIHF1aWNrc29ydCwgaXQncyBqdXN0IHRvIGRlbW9uc3RyYXRlCgkJLy8vIHRoZSB1c2FnZSBvZiBwcmVkaWNhdGUuCgoJCXN0ZDo6c29ydChiZWdpbiwgZW5kLCBwcmVkaWNhdGUpOwkKCX0KCQoJaW50IG1haW4oKSB7CgkJc3RkOjp2ZWN0b3I8VGVhbVN0YXRzPiBhcnIgewoJCQl7ICJSZWQiLCAgIDEwMCwgMzAsIH0sCgkJCXsgIkJsdWUiLCAgMTUwLCAxMCwgfSwKCQkJeyAiR3JlZW4iLCAyMDAsIDIwLCB9LAoJCX07CgkKCQkvLyBhcHByb2FjaCBvbmUsIHN0b3JlIHRoZSBsYW1iZGEgYmVmb3JlIGhhbmQKCQlhdXRvIHNvcnRCeVlhcmRzID0gW10oY29uc3QgVGVhbVN0YXRzJiBsaHMsIGNvbnN0IFRlYW1TdGF0cyYgcmhzKSAtPiBib29sIHsKCQkJcmV0dXJuIGxocy55YXJkc19wZXJfZ2FtZSA8IHJocy55YXJkc19wZXJfZ2FtZTsKCQl9OwoJCXF1aWNrU29ydChhcnIuYmVnaW4oKSwgYXJyLmVuZCgpLCBzb3J0QnlZYXJkcyk7CgkJc3RkOjpjb3V0IDw8ICJCeSB5YXJkczpcbiI7CgkJZm9yIChhdXRvJiBpdCA6IGFycikgewoJCQlzdGQ6OmNvdXQgPDwgaXQueWFyZHNfcGVyX2dhbWUgPDwgIiAiIDw8IGl0Lm5hbWUgPDwgIlxuIjsKCQl9CgkJCgkJLy8gYXBwcm9hY2ggdHdvLCB3cml0ZSB0aGUgbGFtYmRhIGlubGluZS4KCQlxdWlja1NvcnQoYXJyLmJlZ2luKCksIGFyci5lbmQoKSwgW10oY29uc3QgVGVhbVN0YXRzJiBsaHMsIGNvbnN0IFRlYW1TdGF0cyYgcmhzKSAtPiBib29sIHsKCQkJcmV0dXJuIGxocy50b3RhbF9wb2ludHMgPCByaHMudG90YWxfcG9pbnRzOwoJCX0pOwoJCXN0ZDo6Y291dCA8PCAiQnkgcG9pbnRzOlxuIjsKCQlmb3IgKGF1dG8mIGl0IDogYXJyKSB7CgkJCXN0ZDo6Y291dCA8PCBpdC50b3RhbF9wb2ludHMgPDwgIiAiIDw8IGl0Lm5hbWUgPDwgIlxuIjsKCQl9CgkKCQlyZXR1cm4gMDsKCX0=