所有元素都会在插入式被自动排序;
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; }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; }