1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
struct Person
{
std::string m_firstName;
std::string m_lastName;
Person (const std::string& firstName, const std::string& lastName)
: m_firstName(firstName), m_lastName(lastName){}//member initialization list
bool operator < (const Person & p)//operator < overload
{
return m_lastName < p.m_lastName;
}
};
std::ostream& operator << (std::ostream& os, const Person& p)
{
os << p.m_firstName << " " << p.m_lastName << '\n';
return os;
}
struct customSort // struct for comparison
{
bool operator ()(const Person& lhs, const Person& rhs)
{
return lhs.m_lastName < rhs.m_lastName;
}
}cS;//named function object
int main()
{
std::vector<Person> vec {{"John", "Smith"}, {"Jane", "Doe"}, {"Just", "Other"}, {"Some", "Boy"}, {"Some", "Gal"}};
//uniform initialization using initializer lists
//std::sort (vec.begin(), vec.end());
//uses overloaded < operator as default std::sort predicate
// std::sort(vec.begin(), vec.end(), [](const Person& lhs, const Person& rhs)
//{return lhs.m_lastName < rhs.m_lastName;});
//uses lambda as std::sort predicate
// std::sort (vec.begin(), vec.end(), customSort());
//construct a function object as std::sort predicate;
// std::sort (vec.begin(), vec.end(), cS);
//use a named function object as std::sort predicate;
for (auto& elem : vec){std::cout << elem ;}//can print Person objects directly as operator << is overloaded above
}
|