C++中的set/multiset容器 Posted on 2022-12-10 17:29:08 2022-12-10 17:29:08 by Author 摘要 c++ 学习笔记,set/multiset容器的学习笔记 #### set/multiset容器 - 所有元素都会在插入时候自动被排序 - 本质:set/multiset属于关联性质容器,底层结构二叉树实现 set和multiset的区别: - set不允许容器中有重复的元素 - mutliset允许容器中有重复的元素 #### set构造和赋值 - set<T> st; - set(const set& st);//拷贝构造 - ```c++ #include<algorithm> #include<set> #include<iostream> using namespace std; void printList(const set<int>&l){ for(set<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test01(){ set<int>s1; //set插入数据用insert(),不用push_back() s1.insert(10); s1.insert(20); s1.insert(60); s1.insert(40); s1.insert(5); //默认元素插入会自动排序, //不允许插入重复的值 printList(s1); //5,10,20,40,60 set<int>s2(s1); printList(s2); set<int>s3=s2; printList(s2); } int main(){ test01(); return 0; } ``` ##### set大小和交换 ```c++ #include<algorithm> #include<set> #include<iostream> using namespace std; void printList(const set<int>&l){ for(set<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test02(){ set<int> s1; s1.insert(10); s1.insert(20); s1.insert(60); s1.insert(40); s1.insert(5); cout<<s1.size()<<endl; cout<<s1.empty()<<endl;// 0 set<int>s2; s2.insert(1); s2.insert(2); s2.insert(3); cout<<"交换前"<<endl; printList(s1); printList(s2); s1.swap(s2); cout<<"交换后"<<endl; printList(s1); printList(s2); } int main(){ test02(); return 0; } ``` - 不支持resize(); ##### 插入和删除 函数原型: - insert(elem); - clear(); - erase(pos);//迭代器删除 - erase(beg,end);//删除区间的所有元素 - erase(elem);//删除容器中值为elem的元素 - ```c++ #include<algorithm> #include<set> #include<iostream> using namespace std; void printList(const set<int>&l){ for(set<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test03(){ set<int>s1; s1.insert(10); s1.insert(20); s1.insert(60); s1.insert(40); s1.insert(5); printList(s1); cout<<"删除元素"<<endl; s1.erase(s1.begin()); printList(s1); cout<<"删除特定的元素"<<endl; s1.erase(20); printList(s1); cout<<"删除所有的元素"<<endl; s1.clear(); } int main(){ test03(); return 0; } ``` ##### set查找和统计 - find(key);//返回该键元素的迭代器,不存在,返回set.end(); - count(key);//统计key的个数(0和1) - ```c++ #include<algorithm> #include<set> #include<iostream> using namespace std; void printList(const set<int>&l){ for(set<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test04(){ set<int>s1; s1.insert(10); s1.insert(20); s1.insert(60); s1.insert(20); s1.insert(5); printList(s1); set<int>::iterator pos = s1.find(10); if(pos!=s1.end()){ cout<<"找到该元素"<<endl; cout<<*pos<<endl; }else{ cout<<"未找到元素"<<endl; } int nums = s1.count(20); cout<<"20的个数为:"<<nums<<endl; } int main(){ test04(); return 0; } ``` ##### set和multiset的区别 - set不可插入重复的数据,而multiset可以 - set插入数据的同时会返回插入结果,表示插入成功 - multiset不会检测数据,因此可以重复插入 - ```c++ #include<algorithm> #include<set> #include<iostream> using namespace std; void printList(const set<int>&l){ for(set<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } void test01(){ set<int>s1; //set插入数据用insert(),不用push_back() s1.insert(10); s1.insert(10); pair<set<int>::iterator,bool> ret = s1.insert(30); if(ret.second){ cout<<"插入成功"<<endl; } ret = s1.insert(30); if(ret.second){ cout<<"插入成功"<<endl; }else{ cout<<"插入失败"<<endl; } printList(s1);//10 , 30 multiset<int> ms; ms.insert(10); ms.insert(10); for(multiset<int>::const_iterator it=ms.begin();it!=ms.end();it++){ cout<<*it<<" "; }//10 ,10 cout<<endl; } int main(){ test01(); return 0; } ``` #### pair对组创建 - pair(type,type) p(value1,value2); - pair(type,type) p = make_pair(value1,value2); - ```c++ #include<algorithm> #include<set> #include<iostream> using namespace std; void test01(){ pair<string,int> p("tom",20); cout<<"姓名:"<<p.first<<" 年龄:"<<p.second<<endl; pair<string,int>p2= make_pair("jerry",30); cout<<"姓名:"<<p2.first<<" 年龄:"<<p2.second<<endl; } int main(){ test01(); return 0; } ``` ##### set容器的排序 - 利用仿函数,可以改变排序规则 - ```c++ #include<algorithm> #include<set> #include<iostream> using namespace std; void printList(const set<int>&l){ for(set<int>::const_iterator it=l.begin();it!=l.end();it++){ cout<<*it<<" "; } cout<<endl; } class MyCompare{ public: //第一个()表示的重载的符号 bool operator()(int v1,int v2){ return v1>v2; } }; void test01(){ set<int> s1; s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(5); s1.insert(10); printList(s1); //插入之前写入规则 //插入之后指定不了排序规则 set<int,MyCompare> s2; s2.insert(10); s2.insert(40); s2.insert(20); s2.insert(5); s2.insert(10); for(set<int,MyCompare>::iterator it=s2.begin();it!=s2.end();it++){ cout<<*it<<" "; } } int main(){ test01(); return 0; } ``` ##### set存放自定义数据类型 - ```c++ #include<set> #include<iostream> #include<string> using namespace std; class Person{ public: Person(string name, int age){ this->m_age = age; this->m_name = name; } int m_age; string m_name; }; class MyCompare2{ public: //第一个()表示的重载的符号 bool operator()(const Person& v1, const Person& v2){ return v1.m_age>v2.m_age; } }; void test01(){ set<Person,MyCompare2> s1; Person p1("刘备",41); Person p2("关羽",45); Person p3("张飞",30); Person p4("赵云",25); s1.insert(p1); s1.insert(p2); s1.insert(p3); s1.insert(p4); for(set<Person>::const_iterator it=s1.begin();it!=s1.end();it++){ cout<<"姓名: "<<(*it).m_name<<" 年龄:"<<(*it).m_age<<endl; } } int main(){ test01(); return 0; } ``` -
{{ item.content }}
{{ child.content }}