3.8 set/multiset容器
3.8.1 set基本概念
简介:所有元素都会在插入时自动被排序
本质:set/multiset属于关联式容器,底层结构是用二叉树实现
set和multiset区别:
set不允许容器中有重复的元素
multiset允许容器中有重复元素
3.8.2 set构造与赋值
功能描述:创建set容器以及赋值
构造:
set<T> st; //默认构造函数
set(const set &st); //拷贝构造函数
赋值:
set& operator=(const set &st);//重载等号操作符
set:
#include<iostream> #include<set> using namespace std; #include<string> //set容器构造和赋值 void printSet(set<int>&s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s1; //插入数据只有insert方式 s1.insert(30); s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); //遍历容器 //set特点:1、所有元素再插入的时候会自动排序 2、不允许插入重复值 printSet(s1); //10 20 30 40 //拷贝构造 set<int>s2(s1); printSet(s2); //10 20 30 40 //赋值 set<int>s3; s3 = s2; printSet(s3); //10 20 30 40 } int main() { test1(); system("pause"); return 0; }
multiset:
#include<iostream> #include<set> using namespace std; #include<string> //multiset容器构造和赋值 void printmultiSet(multiset<int>&s) { for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { multiset<int>s1; //插入数据只有insert方式 s1.insert(30); s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); //遍历容器 //set特点:1、所有元素再插入的时候会自动排序 2、不允许插入重复值 printmultiSet(s1); //10 20 30 30 40 //拷贝构造 multiset<int>s2(s1); printmultiSet(s2); //10 20 30 30 40 //赋值 multiset<int>s3; s3 = s2; printmultiSet(s3); //10 20 30 30 40 } int main() { test1(); system("pause"); return 0; }
3.8.3 set大小和交换
功能描述:
统计set容器大小以及交换set容器
函数原型:
size(); //返回容器中元素个数
empty(); //判断容器是否为空
swap(); //交换两个集合容器
#include<iostream> #include<set> using namespace std; //set容器大小和交换 void printSet(set<int>&s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } //大小 void test1() { set<int>s1; s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); if (s1.empty()) { cout << "set s1容器为空" << endl; } else { cout << "set s1容器不为空" << endl; printSet(s1); //10 20 30 40 cout << "s1的大小为:" << s1.size() << endl; //s1的大小为:4 } } //交换 void test2() { set<int>s1; s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(30); set<int>s2; s2.insert(50); s2.insert(70); s2.insert(60); s2.insert(80); cout << "交换前:" << endl; printSet(s1); //10 20 30 40 printSet(s2); //50 60 70 80 cout << "交换后:" << endl; s1.swap(s2); printSet(s1); //50 60 70 80 printSet(s2); //10 20 30 40 } int main() { test1(); test2(); system("pause"); return 0; }
3.8.4 set插入和删除
功能描述:set容器进行插入数据和删除数据
函数原型:
insert(elem); //在容器中插入元素
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(elem); //删除容器中值为elem的元素
#include<iostream> using namespace std; #include<set> //set容器 插入与删除 void printSet(set<int>& s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s; //插入 s.insert(20); s.insert(10); s.insert(30); s.insert(50); s.insert(40); printSet(s); //10 20 30 40 50 //删除 s.erase(s.begin()); printSet(s); //20 30 40 50 s.erase(30); printSet(s); //20 40 50 s.erase(s.begin(),s.end()); printSet(s); //打印一行空白 s.clear(); printSet(s); //打印一行空白 } int main() { test1(); system("pause"); return 0; }
3.8.5 set查找与统计
功能描述:对set容器进行查找数据以及统计数据
函数原型:
find(key); //查找key是否存在,若存在,返回该键的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数 //对set而言,统计元素的个数的结果,要么是0,要么是1。但multiset可以统计真实个数
set:
#include<iostream> using namespace std; #include<set> //set容器 插入与删除 void printSet(set<int>& s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printSet(s); //10 20 30 40 50 //cout << "set容器中30的数量:" << s.find(30) << endl; //想法错了 set<int>::iterator pos = s.find(50); if (pos != s.end()) { cout << "找到元素:" << *pos << endl; } else { cout << "未找到元素!" << endl; } } //统计 void test2() { set<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printSet(s); //10 20 30 40 50 int num = s.count(30); //对set而言,统计元素的个数的结果,要么是0,要么是1 cout << "所要统计的元素个数为:" << num << endl; //num = 1 } int main() { test1(); test2(); system("pause"); return 0; }
multiset:
#include<iostream> using namespace std; #include<set> //multiset容器 插入与删除 void printMultiet(multiset<int>& s) { for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { multiset<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printMultiet(s); //10 20 30 30 30 30 30 40 50 //cout << "set容器中30的数量:" << s.find(30) << endl; //想法错了 multiset<int>::iterator pos = s.find(50); if (pos != s.end()) { cout << "找到元素:" << *pos << endl; } else { cout << "未找到元素!" << endl; } } //统计 void test2() { multiset<int>s; //插入 s.insert(30); s.insert(20); s.insert(30); s.insert(10); s.insert(30); s.insert(50); s.insert(30); s.insert(40); s.insert(30); printMultiet(s); //10 20 30 30 30 30 30 40 50 int num = s.count(30); //对multiset而言,统计元素的个数的结果是真实的个数 cout << "所要统计的元素个数为:" << num << endl; //num = 5 } int main() { test1(); test2(); system("pause"); return 0; }
3.8.6 set和multiset区别
区别:
1、set不可以插入重复数据,而multiset可以;
2、set插入数据的同时会返回插入结果,表示插入是否成功
3、multiset不会检测数据,因此可以插入重复数据
总结:如果不允许插入重复数据就用set,如果需要插入重复的数据就要用multiset;
#include<iostream> using namespace std; #include<set> //set容器与multiset容器区别 void printSet(set<int>& s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { set<int>s; //不允许插入重复值 pair<set<int>::iterator, bool>ret = s.insert(10); if (ret.second) //ret的第二个参数 即bool为真,表示插入成功 { cout << "第1次插入成功!" << endl; //第1次插入成功! } else { cout << "第1次插入失败!" << endl; } ret = s.insert(10); //再插一次10 if (ret.second) { cout << "第2次插入成功!" << endl; } else { cout << "第2次插入失败!" << endl; //第2次插入失败! } multiset<int>ms; //允许插入重复值 ms.insert(10); ms.insert(10); ms.insert(10); ms.insert(10); for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) { cout << *it << " "; //10 10 10 10 } cout << endl; } int main() { test1(); system("pause"); return 0; }