C++ STL 有關於SET集合部分 的自定義資料型別的排序 以及 pair的使用
阿新 • • 發佈:2019-01-02
#include<iostream> using namespace std; #include"set" //set集合容器的標頭檔案 #include<functional> //用於識別set從大到小中greater的識別 /*知識點集合*/ //1 set為容器 元素唯一(如果插入多個重複元素就會出現只有一個元素被插入) 自動排序(預設情況下 從小到大) 不可以按照[](陣列形式)方式插入元素 //理論基礎是 紅黑樹 平衡二叉樹 // 在less<> 與 greater<> 為庫中提前預定好的函式物件 //在學習的時候 一定要注意如果出現對某個函式有疑問 一定要學會對該函式的原始碼追蹤 //set 的基本操作 初始化以及刪除操作 void main91() { set<int> s1; cout << "set的長度" << s1.size() << endl; //首先插入五個隨機數 for (int i = 0; i < 5; i++) { int temp = rand(); //隨機數 s1.insert(temp); //set的插入 } cout << "set的長度" << s1.size() << endl; set<int>::iterator it = s1.begin(); cout << "set的初始化" << endl; while (it != s1.end()) { cout << *it << " "; it++; } cout << endl; //在插入三個相同的數 驗證是否會保證元素的唯一性 s1.insert(10); s1.insert(10); s1.insert(10); cout << "set的插入相同元素之後" << endl; it = s1.begin(); while (it != s1.end()) { cout << *it << " "; it++; } cout << "set的長度" << s1.size() << endl; cout << endl; cout << "set的刪除元素之後" << endl; it = s1.begin(); while (!s1.empty()) { it = s1.begin(); cout << *it << " "; //刪除操作 s1.erase(s1.begin()); //按位置刪除 } cout << endl; cout << "set的長度" << s1.size() << endl; } //基本資料型別情況下 有關於set自動排序從大到小以及從小到大的深究 void main92() { set<int> s1; //預設情況從小到大 set<int, less<int>> s2; //從小到大的規範寫法 set<int, greater<int>> s3; //從大到小的寫法 //首先插入五個隨機數 for (int i = 0; i < 5; i++) { int temp = rand(); //隨機數 s1.insert(temp); s2.insert(temp); s3.insert(temp); } set<int>::iterator it = s1.begin(); //預設情況下的迭代器 cout << "預設情況下的set:" ; while (it != s1.end()) { cout << *it << " "; it++; } cout << endl; set<int,less<int>>::iterator it1 = s2.begin(); //從小到大規範寫法情況下的迭代器 cout << "從小到大規範寫法情況下的set:"; while (it1 != s2.end()) { cout << *it1 << " "; it1++; } cout << endl; set<int, greater<int>>::iterator it2 = s3.begin(); //從大到小規範寫法情況下的迭代器 cout << "從大到小規範寫法情況下的set:"; while (it2 != s3.end()) { cout << *it2 << " "; it2++; } cout << endl; } //複雜資料型別情況的排序 例如Student類 //涉及到自定義資料型別的排序 ----->仿函式 class Student{ public: Student(char * name,int age) { strcpy(this->name, name); this->age = age; } public: char name[128]; int age; }; //仿函式的構成 結構體的形式 struct FuncStudent{ bool operator()(const Student &left, const Student &right) //對於()的過載 { if (left.age < right.age) { return true; } else { return false; } } }; //仿函式的基本用法 void main93() { Student s1("s1",11), s2("s2",6), s3("s3",44), s4("s4",17); set<Student,FuncStudent> set1; set1.insert(s1); set1.insert(s2); set1.insert(s3); set1.insert(s4); //遍歷 for (set<Student, FuncStudent>::iterator it = set1.begin(); it != set1.end(); it++) { cout << it->age << " " << it->name << endl; } } //涉及到insert()的返回值 pair的概念 對組 void main94() { Student s1("s1", 11), s2("s2", 6), s3("s3", 44), s4("s4", 17),s5("s5",11); set<Student, FuncStudent> set1; pair<set<Student, FuncStudent>::iterator,bool> pair1 = set1.insert(s1); if (pair1.second == true) { cout << "s1插入成功" << endl; } else { cout << "s1插入失敗" << endl; } set1.insert(s2); set1.insert(s3); set1.insert(s4); //因為set集合具有一個唯一性,因此每次插入元素可以根據返回值 驗證是否插入成功 pair<set<Student, FuncStudent>::iterator, bool> pair5 = set1.insert(s5); if (pair5.second == true) { cout << "s5插入成功" << endl; } else { cout << "s5插入失敗" << endl; } //遍歷 for (set<Student, FuncStudent>::iterator it = set1.begin(); it != set1.end(); it++) { cout << it->age << " " << it->name << endl; } } int main() { //main91(); //set 的基本操作 初始化以及刪除操作 //main92(); //基本資料型別情況下 有關於set自動排序從大到小以及從小到大的深究 //main93();//仿函式的基本用法 main94(); //涉及到insert()的返回值 pair的概念 對組 system("pause"); return 0; }