set/multiset:所有元素在插入时会自动排序
属于关联式容器,底层结构用二叉树实现
区别:
1.set不允许容器中有重复元素
2.multiset允许容器中有重复元素
set容器构造和赋值
#include#include using namespace std; void printlist(const set & l) { for (set ::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; } } //set容器的创建和赋值 void test1() { set s1; //set容器插入数据只有insert方式 //set容器不允许有重复元素 s1.insert(10); s1.insert(30); s1.insert(40); s1.insert(20); //拷贝构造 set s2(s1); //赋值 set s3; s3 = s2; }
set容器的大小和交换
#include#include using namespace std; void printlist(const set & l) { for (set ::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; } } //set容器的大小和交换操作 void test1() { set s1; s1.insert(10); s1.insert(30); s1.insert(40); s1.insert(20); //判断是否为空 if (s1.empty()) { cout << "为空" << endl; } else { cout << "不为空" << endl; cout << s1.size() << endl;//set容器无法重新指定容器大小,不能使用resize } //交换 set s2; s2.insert(100); s2.insert(300); s2.insert(400); s2.insert(200); s1.swap(s2); }
set容器的插入和删除
#include#include using namespace std; void printlist(const set & l) { for (set ::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; } } //set容器的插入和删除 void test1() { set s1; //插入 s1.insert(10); s1.insert(30); s1.insert(40); s1.insert(20); //删除 s1.erase(s1.begin());//删除排序后对应位置的数字 s1.erase(30);//删除指定数字 s1.clear(); }
set容器的查找和统计
#include#include using namespace std; void printlist(const set & l) { for (set ::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; } } //set容器的查找和统计 void test1() { set s1; //插入 s1.insert(10); s1.insert(30); s1.insert(40); s1.insert(20); //查找元素 //find函数会返回元素位置的迭代器,需要用一个迭代器接收;如果没找到,会返回end() set ::iterator it = s1.find(40); //end是最后一个元素的下一个位置,因此即使数据在最后一个位置也能找到 if (it != s1.end()) { cout << "找到" << endl; } else { cout << "没找到" << endl; } //统计指定数值的个数 int num = s1.count(30); cout << num << endl; }
set和multiset的区别:
1.set不可以插入重复数据,multiset可以
2.set插入数据时会返回插入结果,表示插入是否成功
3.multiset不会检测数据,因此可以插入重复数据
#include#include using namespace std; void printset(const set & l) { for (set ::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; } } void printmutiset(const multiset & ms) { for (multiset ::const_iterator it = ms.begin(); it != ms.end(); it++) { cout << *it << endl; } } //set容器的查找和统计 void test1() { set s1; //插入 //s1.insert(10); //set不允许插入重复值 //set的插入会返回插入结果,可以返回为迭代器 pair ::iterator, bool>ret = s1.insert(10); if (ret.second) { cout << "第一次插入成功" << endl; } else { cout << "第一次插入失败" << endl; } //multiset允许插入重复值 multiset ms; ms.insert(10); ms.insert(10); printmutiset(ms); }
set容器排序
set容器默认排序为从小到大,可以通过仿函数进行从大到小排序
#include#include using namespace std; void printset(const set & l) { for (set ::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; } } class mycompare { public: bool operator()(int v1, int v2) { return v1 > v2; } }; //set容器的排序 void test1() { //指定排序规则为从大到小 //在创建容器之前设定从大到小 //创建compare类的仿函数 set s2; set s1; s1.insert(50); s1.insert(10); s1.insert(20); s1.insert(40); s1.insert(30); }
set容器自定义数据类型指定排序规则
#include#include using namespace std; void printset(const set & l) { for (set ::const_iterator it = l.begin(); it != l.end(); it++) { cout << (*it).m_name <<(*it).m_age<< endl; } } class person { public: person(string name, int age) { this->m_name = name; this->m_age = age; } string m_name; int m_age; }; //仿函数把person作为参数,所以要在person类创建之后再创建 class mycompare { public: bool operator()(const person& p1, const person& p2) { return p1.m_age > p2.m_age; } }; //set容器自定义数据类型指定排序规则 void test1() { //自定义数据类型应指定排序规则 set s; //创建person对象 person p1("A", 10); person p2("B", 20); person p3("C", 30); s.insert(p1); s.insert(p2); s.insert(p3); }



