#include #include using namespace std; class Student { unsigned id; string name; public: Student() = delete; Student(unsigned arg1, string arg2 = "") : id(arg1), name(arg2) {} Student(const Student&) = default; bool operator<(const Student& obj) const { return id < obj.id; } bool operator==(const Student& obj) const { return id == obj.id; } friend ostream& operator<<(ostream& out, const Student& obj) { out << obj.id << " " << obj.name; return out; } }; ostream& operator<<(ostream& out, const set& stu) { for (auto it = stu.cbegin(); it != stu.cend(); ++it) { out << *it << endl; } return out; } int main() { set Students; Students.insert({117,"John"}); Students.insert({124,"Paul"}); Students.insert({102,"George"}); Students.insert({106,"Ringo"}); Students.insert({223,"Peter"}); Students.insert({203,"Paul"}); Students.insert({243,"Mary"}); cout << "Students.size() = " << Students.size() << endl; cout << Students << endl; bool insertSuccess; cout << boolalpha; insertSuccess = Students.insert({309,"Mick"}).second; cout << "insert 309: " << insertSuccess << endl; insertSuccess = Students.insert({117,"Nobody"}).second; cout << "insert 117: " << insertSuccess << endl << endl; cout << "find 106: " << *(Students.find(106)) << endl; // How does this work? // cout << *(Students.find(107)) << endl; // ERROR unsigned id; set::const_iterator it; cout << "find 203: " << (Students.find(203) != Students.end()) << endl; cout << "find 107: " << (Students.find(107) != Students.end()) << endl << endl; cout << "Before erase: Students.size() = " << Students.size() << endl; id = 203; Students.erase(Students.find(id)); // Did this work? cout << "After erase of 203: Students.size() = " << Students.size() << endl; cout << "Students.erase(102) = " << Students.erase(102) << endl; cout << "Students.erase(103) = " << Students.erase(103) << endl; }