setmultiset容器

    科技2022-07-11  113

    基本概念

    所有元素都会在插入式被自动排序;

    set/multiset属于关联式容器,底层结构是用红黑树实现;区别: 1)set不允许容器中有重复的元素; 2)multiset允许容器中有重复的元素;

    常用接口

    构造函数:

    set s;set(const set &s); 赋值操作:set& operator=(const set &s); #include<iostream> #include<set> using namespace std; void printSet(set<int>&s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test() { //1、默认构造 set<int>s1; //插入数据 s1.insert(10); s1.insert(60); s1.insert(30); s1.insert(10); s1.insert(20); //所有元素插入式被自动排序 且不允许插入重复的值 printSet(s1); //2、拷贝构造 set<int>s2(s1); printSet(s2); //3、赋值操作 set<int>s3; s3 = s2; printSet(s3); } int main() { test(); system("pause"); return 0; }

    set大小和交换:

    size();//返回容器中元素的个数empty();//判断是否为空swap();//交换两个集合容器 set插入和删除insert(elem);clear();erase(pos);//删除pos迭代器所指的元素,并返回下一个元素的迭代器erase(beg,end);erase(elem);//删除容器中值为elem的元素 #include<iostream> #include<set> using namespace std; void printSet(set<int>&s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test() { set<int>s1; s1.insert(10); s1.insert(60); s1.insert(30); s1.insert(10); s1.insert(20); s1.insert(5); printSet(s1); //删除 迭代器版本 s1.erase(s1.begin()); printSet(s1); //删除 重载版本 s1.erase(10); printSet(s1); //清空 s1.clear(); printSet(s1); } int main() { test(); system("pause"); return 0; }

    set查找和统计:

    find(key);//查找key是否存在,存在返回该元素的迭代器,不存在返回set.end();count(key);//统计key元素个数 #include<iostream> #include<set> using namespace std; void printSet(set<int>&s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test() { set<int>s1; s1.insert(10); s1.insert(60); s1.insert(30); s1.insert(10); s1.insert(20); s1.insert(5); printSet(s1); //无论有没有10,都会返回一个迭代器,所以用一个迭代器位置去接收结果 set<int>::iterator pos=s1.find(10); if (pos != s1.end()) { cout << "找到元素:" << *pos << endl; } else { cout << "未找到元素" << endl; } //统计 int num=s1.count(10); //对于set而言 统计结果要么是0 要么是1 cout << "num=" << num << endl; } int main() { test(); system("pause"); return 0; }

    set与multiset区别

    set不可以插入重复数据,multiset可以;因为multiset不会检测数据,因此可以插入重复数据;set插入数据的同时会返回插入结果,表示插入是否成功; #include<iostream> #include<set> using namespace std; void test() { set<int>s1; pair<set<int>::iterator ,bool> ret=s1.insert(10); if (ret.second) { cout << "第一次插入成功!" << endl; } else { cout << "第一次插入不成功!" << endl; } ret = s1.insert(10); if (ret.second) { cout << "第二次插入成功!" << endl; } else { cout << "第二次插入不成功!" << endl; } } int main() { test(); system("pause"); return 0; }

    pair对组创建

    成对出现的数据,利用对组可以返回两个数据;不需要包含头文件;两张纸创建方式: 1)pair<type,type> p(value1,value2);//默认构造,<>中指定两个数据类型,()中赋初值 2)pair <type,type> p=make_pair(value1,value2); #include<iostream> using namespace std; void test() { pair<int, double> p1(10, 2.333);//定义 cout << p1.first << " " << p1.second << endl;//对组的访问 pair<int, double> p2 = make_pair(12, 18.999); cout << p2.first << " " << p2.second << endl; } int main() { test(); system("pause"); return 0; }

    set容器排序

    set容器默认排序规则为从小到大,掌握如何改变排序规则;利用仿函数,可以改变排序规则; 1)存放内置的数据类型 因为set容器默认排序规则为从小到大,所以创建一个set容器并打印,不出意外结果是这样的: 在创建容器的时候就告诉它从大到小进行排序,利用仿函数 #include<iostream> #include<set> using namespace std; //仿函数 本质是一个类型 class myCompare { public: bool operator()(int v1,int v2) { return v1 > v2;//v1>v2 返回真 } }; void test() { set<int>s1; s1.insert(30); s1.insert(20); s1.insert(50); s1.insert(10); //默认是升序排序 for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) { cout << *it << " "; } cout << endl; //利用仿函数改为降序排序 set<int, myCompare>s2;//指定规则为降序 s2.insert(30); s2.insert(20); s2.insert(50); s2.insert(10); for (set<int, myCompare>::iterator it = s2.begin(); it != s2.end(); it++) { cout << *it << " "; } cout << endl; } int main() { test(); system("pause"); return 0; }

    2)存放自定义的数据类型 自定义的数据类型在创建时都会指定排序规则,否则无法插入数据;

    #include<iostream> #include<set> #include<string> using namespace std; class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } string m_Name; int m_Age; }; //仿函数本质上是一个类 class comparePerson { public: bool operator()(const Person&p1,const Person &p2)//第一个代表重载符号,第二个代表形参列表 { return p1.m_Age > p2.m_Age;//降序排列 } }; void test() { //自定义数据类型 都会指定排序规则 set<Person, comparePerson>s; Person p1("鲁班", 20); Person p2("刘禅", 18); Person p3("钟馗", 30); s.insert(p1); s.insert(p2); s.insert(p3); for (set<Person,comparePerson>::iterator it = s.begin(); it != s.end(); it++) { cout <<"姓名:"<<it->m_Name<<" 年龄:"<<it->m_Age<<endl; } cout << endl; } int main() { test(); system("pause"); return 0; }

    Processed: 0.009, SQL: 8