C提高编程---3.8 STL-常用容器-set/multiset 容器【P223~P230】3.8 set/multiset 容器3.8.1 set 容器基本概念3.8.2 set 构造和赋值3.8.3 set 大小和交换3.8.4 set 插入和删除3.8.5 set 查找和统计3.8.6 set 和 multiset 区别3.8.7 pair 对组创建3.8.8 set 容器排序示例1set 存放内置数据类型示例2set 存放自定义数据类型3.8 set/multiset 容器3.8.1 set 容器基本概念简介:所有元素都会在插入时自动被排序本质:set/multiset 属于关联式容器底层结构是用二叉树实现。set 和 multiset 区别set不允许容器中有重复的元素multiset允许容器中有重复的元素3.8.2 set 构造和赋值#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);printSet(S1);S1.insert(30);printSet(S1);S1.insert(20);S1.insert(30);S1.insert(40);printSet(S1);// set 容器特点所有元素插入时候自动被排序// set 容器不允许插入重复值// 拷贝构造setintS2(S1);printSet(S2);// 赋值setintS3;S3S2;printSet(S3);}intmain(){test01();system(pause);return0;}3.8.3 set 大小和交换#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);if(S1.empty())coutS1 为空endl;else{coutS1 不为空endl;coutS1 的大小为S1.size()endl;}}voidtest02(){coutendl交换前 endl;setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);setintS2;// 插入数据只有 insert 方式S2.insert(100);S2.insert(400);S2.insert(300);S2.insert(200);printSet(S2);S1.swap(S2);coutendl交换后 endl;printSet(S1);printSet(S2);}intmain(){test01();test02();system(pause);return0;}3.8.4 set 插入和删除#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);// 删除S1.erase(S1.begin());printSet(S1);// 删除指定元素S1.erase(30);printSet(S1);// 清空S1.erase(S1.begin(),S1.end());//S1.clear();printSet(S1);}intmain(){test01();system(pause);return0;}3.8.5 set 查找和统计#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);// 查找setint::iterator posS1.find(40);if(pos!S1.end()){cout找到元素*posendl;}else{cout未找到元素endl;}// 统计intnumS1.count(30);coutnumendl;}intmain(){test01();system(pause);return0;}3.8.6 set 和 multiset 区别#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式pairsetint::iterator,boolretS1.insert(10);if(ret.second)cout第一次插入成功endl;elsecout第一次插入失败endl;retS1.insert(10);if(ret.second)cout第二次插入成功endl;elsecout第二次插入失败endl;multisetintS2;S2.insert(10);S2.insert(10);for(multisetint::iterator itS2.begin();it!S2.end();it){cout*it ;}coutendl;}intmain(){test01();system(pause);return0;}3.8.7 pair 对组创建#includeiostream#includestringusingnamespacestd;voidtest01(){// 第一种方式pairstring,intp(Tom,20);cout姓名p.first 年龄p.secondendl;// 第二种方式pairstring,intp2make_pair(Jerry,30);cout姓名p2.first 年龄p2.secondendl;}intmain(){test01();system(pause);return0;}3.8.8 set 容器排序示例1set 存放内置数据类型#includeiostream#includestring#includesetusingnamespacestd;// 仿函数classMyCompare{public:booloperator()(intv1,intv2){returnv1v2;// 降序排列}};voidtest01(){setintS1;S1.insert(10);S1.insert(50);S1.insert(20);S1.insert(40);S1.insert(30);for(setint::iterator itS1.begin();it!S1.end();it){cout*it ;}coutendl;// 在插数之前指定排序规则为从大到小setint,MyCompareS2;S2.insert(10);S2.insert(50);S2.insert(20);S2.insert(40);S2.insert(30);for(setint,MyCompare::iterator itS2.begin();it!S2.end();it){cout*it ;}coutendl;}intmain(){test01();system(pause);return0;}示例2set 存放自定义数据类型#includeiostream#includestring#includesetusingnamespacestd;classPerson{public:Person(string name,intage){this-name_name;this-age_age;//this-hight_ hight_;}string name_;intage_;inthight_;};// 仿函数classMyCompare{public:booloperator()(Person v1,Person v2){returnv1.age_v2.age_;// 降序排列}};voidtest01(){multisetPerson,MyCompares;// 创建 Person 对象Personp1(刘备,35);Personp2(曹操,45);Personp3(孙权,40);Personp4(赵云,25);Personp5(关羽,35);Personp6(张飞,35);// 对于自定义的数据类型应该指定排序规则否则set 不知道按照什么排序s.insert(p1);s.insert(p2);s.insert(p3);s.insert(p4);s.insert(p5);s.insert(p6);for(multisetPerson,MyCompare::iterator its.begin();it!s.end();it){cout姓名it-name_ 年龄it-age_endl;}}intmain(){test01();system(pause);return0;}
C++提高编程---3.8 STL-常用容器-set/multiset 容器【P223~P230】
发布时间:2026/5/30 14:35:08
C提高编程---3.8 STL-常用容器-set/multiset 容器【P223~P230】3.8 set/multiset 容器3.8.1 set 容器基本概念3.8.2 set 构造和赋值3.8.3 set 大小和交换3.8.4 set 插入和删除3.8.5 set 查找和统计3.8.6 set 和 multiset 区别3.8.7 pair 对组创建3.8.8 set 容器排序示例1set 存放内置数据类型示例2set 存放自定义数据类型3.8 set/multiset 容器3.8.1 set 容器基本概念简介:所有元素都会在插入时自动被排序本质:set/multiset 属于关联式容器底层结构是用二叉树实现。set 和 multiset 区别set不允许容器中有重复的元素multiset允许容器中有重复的元素3.8.2 set 构造和赋值#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);printSet(S1);S1.insert(30);printSet(S1);S1.insert(20);S1.insert(30);S1.insert(40);printSet(S1);// set 容器特点所有元素插入时候自动被排序// set 容器不允许插入重复值// 拷贝构造setintS2(S1);printSet(S2);// 赋值setintS3;S3S2;printSet(S3);}intmain(){test01();system(pause);return0;}3.8.3 set 大小和交换#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);if(S1.empty())coutS1 为空endl;else{coutS1 不为空endl;coutS1 的大小为S1.size()endl;}}voidtest02(){coutendl交换前 endl;setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);setintS2;// 插入数据只有 insert 方式S2.insert(100);S2.insert(400);S2.insert(300);S2.insert(200);printSet(S2);S1.swap(S2);coutendl交换后 endl;printSet(S1);printSet(S2);}intmain(){test01();test02();system(pause);return0;}3.8.4 set 插入和删除#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);// 删除S1.erase(S1.begin());printSet(S1);// 删除指定元素S1.erase(30);printSet(S1);// 清空S1.erase(S1.begin(),S1.end());//S1.clear();printSet(S1);}intmain(){test01();system(pause);return0;}3.8.5 set 查找和统计#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式S1.insert(10);S1.insert(40);S1.insert(30);S1.insert(20);printSet(S1);// 查找setint::iterator posS1.find(40);if(pos!S1.end()){cout找到元素*posendl;}else{cout未找到元素endl;}// 统计intnumS1.count(30);coutnumendl;}intmain(){test01();system(pause);return0;}3.8.6 set 和 multiset 区别#includeiostream#includesetusingnamespacestd;voidprintSet(constsetintL){for(setint::iterator itL.begin();it!L.end();it){cout*it ;}coutendl;}voidtest01(){setintS1;// 插入数据只有 insert 方式pairsetint::iterator,boolretS1.insert(10);if(ret.second)cout第一次插入成功endl;elsecout第一次插入失败endl;retS1.insert(10);if(ret.second)cout第二次插入成功endl;elsecout第二次插入失败endl;multisetintS2;S2.insert(10);S2.insert(10);for(multisetint::iterator itS2.begin();it!S2.end();it){cout*it ;}coutendl;}intmain(){test01();system(pause);return0;}3.8.7 pair 对组创建#includeiostream#includestringusingnamespacestd;voidtest01(){// 第一种方式pairstring,intp(Tom,20);cout姓名p.first 年龄p.secondendl;// 第二种方式pairstring,intp2make_pair(Jerry,30);cout姓名p2.first 年龄p2.secondendl;}intmain(){test01();system(pause);return0;}3.8.8 set 容器排序示例1set 存放内置数据类型#includeiostream#includestring#includesetusingnamespacestd;// 仿函数classMyCompare{public:booloperator()(intv1,intv2){returnv1v2;// 降序排列}};voidtest01(){setintS1;S1.insert(10);S1.insert(50);S1.insert(20);S1.insert(40);S1.insert(30);for(setint::iterator itS1.begin();it!S1.end();it){cout*it ;}coutendl;// 在插数之前指定排序规则为从大到小setint,MyCompareS2;S2.insert(10);S2.insert(50);S2.insert(20);S2.insert(40);S2.insert(30);for(setint,MyCompare::iterator itS2.begin();it!S2.end();it){cout*it ;}coutendl;}intmain(){test01();system(pause);return0;}示例2set 存放自定义数据类型#includeiostream#includestring#includesetusingnamespacestd;classPerson{public:Person(string name,intage){this-name_name;this-age_age;//this-hight_ hight_;}string name_;intage_;inthight_;};// 仿函数classMyCompare{public:booloperator()(Person v1,Person v2){returnv1.age_v2.age_;// 降序排列}};voidtest01(){multisetPerson,MyCompares;// 创建 Person 对象Personp1(刘备,35);Personp2(曹操,45);Personp3(孙权,40);Personp4(赵云,25);Personp5(关羽,35);Personp6(张飞,35);// 对于自定义的数据类型应该指定排序规则否则set 不知道按照什么排序s.insert(p1);s.insert(p2);s.insert(p3);s.insert(p4);s.insert(p5);s.insert(p6);for(multisetPerson,MyCompare::iterator its.begin();it!s.end();it){cout姓名it-name_ 年龄it-age_endl;}}intmain(){test01();system(pause);return0;}