#include <set>
#include <iostream>
#include <iterator>
#include <string>
class Student {
std::string name;
std::string surname;
int id;
static int next_id;
public:
bool operator<(Student const &other) const {
return id < other.id;
}
std::string getName() const { return name; }
std::string getSurName() const { return surname; }
Student(std::string const &n, std::string const &sn) : name(n), surname(sn), id(next_id++) {}
friend std::ostream &operator<<(std::ostream &os, Student const &s) {
return os << s.id << "\t" << s.getName() << "\t" << s.getSurName();
}
};
int Student::next_id;
struct by_given_name {
bool operator()(Student const &a, Student const &b) const {
if (a.getName() < b.getName())
return true;
if (b.getName() < a.getName())
return false;
return a.getSurName() < b.getSurName();
}
};
std::set<Student, by_given_name> xform(std::set<Student> const &in) {
return std::set<Student, by_given_name>{in.begin(), in.end()};
}
int main() {
std::set<Student> students {
{"Albert", "Einstein"},
{"Marie", "Curie"},
{"Louis", "Pasteur"}
};
auto reordered = xform(students);
std::cout << "Original order:\n";
std::copy(students.begin(), students.end(),
std::ostream_iterator<Student>(std::cout, "\n"));
std::cout << "\nOrdered by name:\n";
std::copy(reordered.begin(), reordered.end(),
std::ostream_iterator<Student>(std::cout, "\n"));
}
I2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CgpjbGFzcyBTdHVkZW50IHsgCglzdGQ6OnN0cmluZyBuYW1lOwoJc3RkOjpzdHJpbmcgc3VybmFtZTsKCWludCBpZDsKCXN0YXRpYyBpbnQgbmV4dF9pZDsKcHVibGljOgoJYm9vbCBvcGVyYXRvcjwoU3R1ZGVudCBjb25zdCAmb3RoZXIpIGNvbnN0IHsgCgkJcmV0dXJuIGlkIDwgb3RoZXIuaWQ7Cgl9CgoJc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWU7IH0KCXN0ZDo6c3RyaW5nIGdldFN1ck5hbWUoKSBjb25zdCB7IHJldHVybiBzdXJuYW1lOyB9CgoJU3R1ZGVudChzdGQ6OnN0cmluZyBjb25zdCAmbiwgc3RkOjpzdHJpbmcgY29uc3QgJnNuKSA6IG5hbWUobiksIHN1cm5hbWUoc24pLCBpZChuZXh0X2lkKyspIHt9CgoJZnJpZW5kIHN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBTdHVkZW50IGNvbnN0ICZzKSB7CgkJcmV0dXJuIG9zIDw8IHMuaWQgPDwgIlx0IiA8PCBzLmdldE5hbWUoKSA8PCAiXHQiIDw8IHMuZ2V0U3VyTmFtZSgpOwoJfQp9OwoKaW50IFN0dWRlbnQ6Om5leHRfaWQ7CgpzdHJ1Y3QgYnlfZ2l2ZW5fbmFtZSB7CiAgICBib29sIG9wZXJhdG9yKCkoU3R1ZGVudCBjb25zdCAmYSwgU3R1ZGVudCBjb25zdCAmYikgY29uc3QgeyAKICAgICAgICBpZiAoYS5nZXROYW1lKCkgPCBiLmdldE5hbWUoKSkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKGIuZ2V0TmFtZSgpIDwgYS5nZXROYW1lKCkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gYS5nZXRTdXJOYW1lKCkgPCBiLmdldFN1ck5hbWUoKTsKICAgIH0KfTsKCgpzdGQ6OnNldDxTdHVkZW50LCBieV9naXZlbl9uYW1lPiB4Zm9ybShzdGQ6OnNldDxTdHVkZW50PiBjb25zdCAmaW4pIHsgCiAgICByZXR1cm4gc3RkOjpzZXQ8U3R1ZGVudCwgYnlfZ2l2ZW5fbmFtZT57aW4uYmVnaW4oKSwgaW4uZW5kKCl9Owp9CgppbnQgbWFpbigpIHsKCXN0ZDo6c2V0PFN0dWRlbnQ+IHN0dWRlbnRzIHsKCQl7IkFsYmVydCIsICJFaW5zdGVpbiJ9LAoJCXsiTWFyaWUiLCAiQ3VyaWUifSwKCQl7IkxvdWlzIiwgIlBhc3RldXIifQoJfTsKCglhdXRvIHJlb3JkZXJlZCA9IHhmb3JtKHN0dWRlbnRzKTsKCglzdGQ6OmNvdXQgPDwgIk9yaWdpbmFsIG9yZGVyOlxuIjsKCXN0ZDo6Y29weShzdHVkZW50cy5iZWdpbigpLCBzdHVkZW50cy5lbmQoKSwgCgkJCXN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxTdHVkZW50PihzdGQ6OmNvdXQsICJcbiIpKTsKCglzdGQ6OmNvdXQgPDwgIlxuT3JkZXJlZCBieSBuYW1lOlxuIjsKCXN0ZDo6Y29weShyZW9yZGVyZWQuYmVnaW4oKSwgcmVvcmRlcmVkLmVuZCgpLAoJCXN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxTdHVkZW50PihzdGQ6OmNvdXQsICJcbiIpKTsKfQo=