fork download
  1. #include <set>
  2. #include <iostream>
  3. #include <iterator>
  4. #include <string>
  5.  
  6. class Student {
  7. std::string name;
  8. std::string surname;
  9. int id;
  10. static int next_id;
  11. public:
  12. bool operator<(Student const &other) const {
  13. return id < other.id;
  14. }
  15.  
  16. std::string getName() const { return name; }
  17. std::string getSurName() const { return surname; }
  18.  
  19. Student(std::string const &n, std::string const &sn) : name(n), surname(sn), id(next_id++) {}
  20.  
  21. friend std::ostream &operator<<(std::ostream &os, Student const &s) {
  22. return os << s.id << "\t" << s.getName() << "\t" << s.getSurName();
  23. }
  24. };
  25.  
  26. int Student::next_id;
  27.  
  28. struct by_given_name {
  29. bool operator()(Student const &a, Student const &b) const {
  30. if (a.getName() < b.getName())
  31. return true;
  32. if (b.getName() < a.getName())
  33. return false;
  34. return a.getSurName() < b.getSurName();
  35. }
  36. };
  37.  
  38.  
  39. std::set<Student, by_given_name> xform(std::set<Student> const &in) {
  40. return std::set<Student, by_given_name>{in.begin(), in.end()};
  41. }
  42.  
  43. int main() {
  44. std::set<Student> students {
  45. {"Albert", "Einstein"},
  46. {"Marie", "Curie"},
  47. {"Louis", "Pasteur"}
  48. };
  49.  
  50. auto reordered = xform(students);
  51.  
  52. std::cout << "Original order:\n";
  53. std::copy(students.begin(), students.end(),
  54. std::ostream_iterator<Student>(std::cout, "\n"));
  55.  
  56. std::cout << "\nOrdered by name:\n";
  57. std::copy(reordered.begin(), reordered.end(),
  58. std::ostream_iterator<Student>(std::cout, "\n"));
  59. }
  60.  
Success #stdin #stdout 0s 3440KB
stdin
Standard input is empty
stdout
Original order:
0	Albert	Einstein
1	Marie	Curie
2	Louis	Pasteur

Ordered by name:
0	Albert	Einstein
2	Louis	Pasteur
1	Marie	Curie