一:基本概念
在插入元素的时候会自动排好序,比如插入的是1,3,4,2,打印是1,2,3,4.底层是通过二叉树结构实现的,set容器不允许有重复的元素,但是multiset允许有元素重复。
二:构造,遍历,赋值
#include <iostream> #include <set> using namespace std; int main() { //构造set set<int> s; s.insert(1); s.insert(2); s.insert(2);//插入一个重复的元素 s.insert(3); s.insert(4); //遍历 for (set<int>::iterator it = s.begin(); it!= s.end(); it++) { cout<<*it;//打印结果1234自动排序,重复的不打印 } //拷贝构造 set<int> s1(s); for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) { cout << *it;//1234 } //赋值 set<int> s3; s3 = s1; for (set<int>::iterator it = s3.begin(); it != s3.end(); it++) { cout << *it;//1234 } }
三:常见操作
1.容器大小、是否为空、交换容器
#include <iostream> #include <set> using namespace std; int main() { set<int> s; s.insert(1); s.insert(3); s.insert(2); //判断是否为空 if (!s.empty()) { //大小 cout << s.size(); } set<int> s2; s2.insert(1); s2.insert(3); //交换 s.swap(s2); for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it;//313 } cout << endl; for (set<int>::iterator it = s2.begin(); it != s2.end(); it++) { cout << *it;//123 } }
2.插入和删除
#include <iostream> #include <set> using namespace std; int main() { set<int> s; s.insert(1); s.insert(3); s.insert(2); //删除 s.erase(s.begin()); for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it;//23 } //删除重载 s.erase(2); for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it;//3 } }
3.查找和统计
#include <iostream> #include <set> using namespace std; int main() { set<int> s; s.insert(1); s.insert(3); s.insert(2); set<int>::iterator it = s.find(2); if (it != s.end()) { cout << *it;//2 } //统计3的个数。对于set这个结果始终是1或者0 但是multiset不一样 int num = s.count(3); cout << num; }
四:set和multiset区别
1.set允许插入重复元素,multiset不允许插入元素
2.set插入数据的同时会返回结果,表示插入成功
#include <iostream> #include <set> using namespace std; int main() { set<int> s; //插入成功,返回一个对组结构的数据pair pair<set<int>::iterator,bool> ret =s.insert(1); if (ret.second) { cout << "第一次插入成功"; } else { cout << "插入失败"; } }
3.multiset不会检测数据 因此可以插入重复元素
五:pair对组
1.对组的创建和定义
pair是c++中用来定义两个成对出现的数据
#include <iostream> #include <set> #include <string> using namespace std; int main() { //第一种创建方式 pair<string, int> p(string("aaa"), 1); cout << p.first << p.second;//成对元素第一个用first第二个使用second //第二种创建方式 pair<string, int> p1 = make_pair(string("aaa"), 1); cout << p.first << p.second; }
六:set中排序规则的指定
1.如果存放的是内置数据类型
#include <iostream> #include <set> #include <string> using namespace std; //通过自定义仿函数定义比较规则 class MyCompare { public: bool operator()(int a, int b) const{ return a > b;//降序 } }; int main() { set<int, MyCompare>s;//引入仿函数 s.insert(30); s.insert(20); for (set<int, MyCompare>::iterator it = s.begin(); it != s.end(); it++) { cout << *it; } }
2.如果存放的是自定义数据类型
#include <iostream> #include <set> #include <string> using namespace std; class person { public: person(int age, string name) { this->age = age; this->name = name; } int age; string name; }; class MyComparePerson { public: bool operator()(const person& p1, const person& p2) const{ return p1.age > p2.age; } }; int main() { //set存放自定义数据类型要制定排序规则 set<person, MyComparePerson>s; person p1(10, "aaa"); person p2(20, "bbb"); person p3(30, "ccc"); s.insert(p1); s.insert(p2); s.insert(p3); for (set<person, MyComparePerson>::iterator it = s.begin(); it != s.end(); it++) { cout << it->name; } }