长沙网站设计报价,wordpress 主机和域名绑定域名,成都网络科技公司排名,台州黄岩做网站一、set/multiset容器
1. set基本概念
简介#xff1a;所有元素都会在插入时自动被排序
本质#xff1a;set/multiset属于关联式容器#xff0c;底层结构是用二叉树实现的
set和multiset的区别#xff1a;set不允许容器中有重复的元素#xff0c;multiset允许容器中有…一、set/multiset容器
1. set基本概念
简介所有元素都会在插入时自动被排序
本质set/multiset属于关联式容器底层结构是用二叉树实现的
set和multiset的区别set不允许容器中有重复的元素multiset允许容器中有重复的元素
2. set构造和赋值
构造
setT st; // 默认构造函数set(const set st); // 拷贝构造函数
赋值
set operator(const set st); // 重载等号操作符
#include iostream
#include setusing namespace std;void printSet(setint s)
{for (setint::iterator it s.begin(); it ! s.end(); it){cout *it ;}cout endl;
}void test01()
{setint s1;s1.insert(40);s1.insert(20);s1.insert(40);s1.insert(20);s1.insert(10);s1.insert(30);s1.insert(20);// 遍历容器// set容器特点所有元素插入时自动被排序// set容器不允许插入重复值printSet(s1);// 拷贝构造setints2(s1);printSet(s2);// 赋值setints3;s3 s2;printSet(s3);
}int main(int argc, char* argv[])
{test01();return 0;
}
3. set大小和交换
函数原型
size(); // 返回容器中元素的数目empty(); // 判断容器是否为空swap(st); // 交换两个集合容器
#include iostream
#include setusing namespace std;void printSet(setint s)
{for (setint::iterator it s.begin(); it ! s.end(); it){cout *it ;}cout endl;
}void test01()
{setint s1;s1.insert(40);s1.insert(20);s1.insert(40);s1.insert(20);s1.insert(10);s1.insert(30);s1.insert(20);// 判断是否为空if (s1.empty()){cout s1为空... endl;}else{cout s1不为空... endl;printSet(s1);cout s1的大小为: s1.size() endl;}setints2;s2.insert(1);s2.insert(3);s2.insert(5);s2.insert(7);s2.insert(9);// 交换前cout ——交换前—— endl;cout s1:;printSet(s1);cout s2:;printSet(s2);// 交换后s1.swap(s2);cout ——交换后—— endl;cout s1:;printSet(s1);cout s2;printSet(s2);
}int main(int argc, char* argv[])
{test01();return 0;
}
4. set插入和删除
函数原型
insert(elem); // 在容器中插入元素clear(); // 清除所有元素erase(pos); // 删除pos迭代器所指的元素返回下一个元素的迭代器erase(beg, end); // 删除区间[beg, end)的所有元素返回下一个元素的迭代器erase(elem); // 删除容器中值为elem的元素
#include iostream
#include setusing namespace std;void printSet(setint s)
{for (setint::iterator it s.begin(); it ! s.end(); it){cout *it ;}cout endl;
}void test01()
{setint s1;s1.insert(40);s1.insert(20);s1.insert(40);s1.insert(20);s1.insert(10);s1.insert(30);s1.insert(20);printSet(s1);// 删除s1.erase(s1.begin());printSet(s1);s1.insert(20);s1.insert(50);printSet(s1);s1.erase(s1.begin(), --s1.end());printSet(s1);s1.erase(50);printSet(s1);// 清空s1.insert(20);s1.insert(30);s1.clear();printSet(s1);
}int main(int argc, char* argv[])
{test01();return 0;
}
5. set查找和统计
函数原型
find(key); // 查找key是否存在存在返回该键的元素的迭代器不存在返回set.end()count(key); // 统计key的元素个数
#include iostream
#include setusing namespace std;void printSet(setint s)
{for (setint::iterator it s.begin(); it ! s.end(); it){cout *it ;}cout endl;
}void test01()
{setint s1;s1.insert(40);s1.insert(20);s1.insert(40);s1.insert(20);s1.insert(10);s1.insert(30);s1.insert(20);printSet(s1);// 查找setint::iterator pos s1.find(30);if (pos ! s1.end()){cout 找到元素: *pos endl;}else{cout 未找到该元素... endl;}// 统计// 对于set而言,统计结果要么为0要么为1cout 30出现的次数为: s1.count(30) endl;
}int main(int argc, char* argv[])
{test01();return 0;
}
6. set和multiset区别
set不可以插入重复数据而multiset可以set插入数据的同时会返回插入结果表示插入是否成功multiset不会检测数据因此可以插入重复数据
#include iostream
#include setusing namespace std;void printSet(setint s)
{for (setint::iterator it s.begin(); it ! s.end(); it){cout *it ;}cout endl;
}void printMultiset(multisetint ms)
{for (multisetint::iterator it ms.begin(); it ! ms.end(); it){cout *it ;}cout endl;
}void test01()
{setint s1;pairsetint::iterator,bool ret s1.insert(10);if (ret.second){cout 第一次插入成功... endl;}else{cout 第一次插入失败... endl;}ret s1.insert(10);if (ret.second){cout 第二次插入成功... endl;}else{cout 第二次插入失败... endl;}cout set为:;printSet(s1);multisetint ms1;ms1.insert(10);ms1.insert(10);cout multiset为:;printMultiset(ms1);
}int main(int argc, char* argv[])
{test01();return 0;
}
7. pair对组创建
成对出现的数据利用对组可以返回两个数据
两种创建方式
pairtype, type p (value1, value2);pairtype, type p make_pair(value1, value2);
#include iostream
#include setusing namespace std;void test01()
{// 对组创建// 1. 第一种方式pairstring, intp1(Tom, 20);cout 姓名: p1.first 年龄: p1.second endl;// 第二种方式pairstring, intp2 make_pair(Jerry, 30);cout 姓名: p2.first 年龄: p2.second endl;
}int main(int argc, char* argv[])
{test01();return 0;
}
8. set排序
问题set容器默认排序规则为从小到大如何改变排序规则
主要技术点利用仿函数可以改变排序规则
1set存放内置数据类型
#include iostream
#include setusing namespace std;void printSet(setint s)
{for (setint::iterator it s.begin(); it ! s.end(); it){cout *it ;}cout endl;
}class myCompare
{
public:bool operator()(int num1, int num2)const{return num1 num2;}
};void printMyset(setint, myCompare ms)
{for (setint,myCompare::iterator it ms.begin(); it ! ms.end(); it){cout *it ;}cout endl;
}void test01()
{setints1;s1.insert(40);s1.insert(20);s1.insert(50);s1.insert(10);s1.insert(30);cout s1为:;printSet(s1);// 指定排序规则为从大到小setint, myCompares2;s2.insert(40);s2.insert(20);s2.insert(50);s2.insert(10);s2.insert(30);cout s2为:;printMyset(s2);
}int main(int argc, char* argv[])
{test01();return 0;
}
2set存放自定义数据类型
#include iostream
#include set
#include stringusing 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)const{return p1.m_Age p2.m_Age;}
};void test01()
{// 自定义数据类型都会指定排序规则setPerson, comparePersons1;// 创建Person对象Person p1(刘备, 40);Person p2(关羽, 30);Person p3(张飞, 25);Person p4(赵云, 20);s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);for (setPerson, comparePerson::iterator it s1.begin(); it ! s1.end(); it){cout 姓名: (*it).m_Name 年龄: (*it).m_Age endl;}// 指定排序规则为从大到小}int main(int argc, char* argv[])
{test01();return 0;
}
总结对于自定义数据类型set必须指定排序规则才可以插入数据
二、map/multimap容器
1. map基本概念
简介
map中所有元素都是pairpair中第一个元素为key键值起到索引作用第二个元素为value实值所有元素都会根据元素的键值自动排序
本质
map/multimap属于关联式容器底层结构是用二叉树实现的
优点
可以根据key值快速找到value值
map和multimap区别
map不允许容器中有重复key值元素multimap允许容器中有重复key值元素
2. map构造和赋值
函数原型
mapT1, T2 mp; // map默认构造函数map(const map mp); // 拷贝构造函数
赋值
map operator(const map mp); // 重载等号操作符
#include iostream
#include mapusing namespace std;void printMap(mapint, int m)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key: (*it).first value: (*it).second endl;}cout endl;
}void test01()
{// 创建map容器mapint, intm1;m1.insert(pairint, int(1, 10));m1.insert(pairint, int(2, 20));m1.insert(pairint, int(3, 30));m1.insert(pairint, int(4, 40));m1.insert(pairint, int(5, 50));printMap(m1);// 拷贝构造mapint, intm2(m1);printMap(m2);// 赋值mapint, intm3;m3 m2;printMap(m3);
}int main(int argc, char* argv[])
{test01();return 0;
}
3. map大小和交换
函数原型
size(); // 返回容器中元素的数目empty(); // 判断容器是否为空swap(st); // 交换两个map容器
#include iostream
#include mapusing namespace std;void printMap(mapint, int m)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key: (*it).first value: (*it).second endl;}cout endl;
}void test01()
{// 创建map容器mapint, intm1;m1.insert(pairint, int(1, 10));m1.insert(pairint, int(2, 20));m1.insert(pairint, int(3, 30));m1.insert(pairint, int(4, 40));m1.insert(pairint, int(5, 50));// 判断map是否为空if (m1.empty()){cout m1为空... endl;}else{cout m1不为空... endl;printMap(m1);cout m1的大小为: m1.size() endl;}mapint, intm2;m2.insert(pairint, int(6, 10));m2.insert(pairint, int(7, 10));m2.insert(pairint, int(8, 10));m2.insert(pairint, int(9, 10));m2.insert(pairint, int(10, 10));// 交换前cout ————交换前———— endl;cout m1: endl;printMap(m1);cout m2: endl;printMap(m2);// 交换后m1.swap(m2);cout ————交换后———— endl;cout m1: endl;printMap(m1);cout m2: endl;printMap(m2);
}int main(int argc, char* argv[])
{test01();return 0;
}
4. map插入和删除
函数原型
insert(elem); // 在容器中插入元素clear(); // 清楚所有元素erase(pos); // 删除pos迭代器所指的元素返回下一个元素的迭代器erase(beg, end); // 删除区间[beg, end)的所有元素返回下一个元素的迭代器erase(key); // 删除容器中值为key的元素
#include iostream
#include mapusing namespace std;void printMap(mapint, int m)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key: (*it).first value: (*it).second endl;}cout endl;
}void test01()
{// 创建map容器mapint, intm1;// 第一种m1.insert(pairint, int(1, 10));// 第二种m1.insert(make_pair(2, 20));// 第三种m1.insert(mapint, int::value_type(3, 30));// 第四种m1[4] 40;// []不建议使用,如果key值不存在,会创建一个valua为0的键值对// []用途可以利用key访问valuecout m1[100] endl;m1[100] 100;cout m1[100] endl;printMap(m1);// 删除m1.erase(m1.begin());printMap(m1);m1.erase(m1.begin(), --m1.end());printMap(m1);m1.erase(100);printMap(m1);// 清空m1.clear();
}int main(int argc, char* argv[])
{test01();return 0;
}
5. map查找和统计
函数原型
find(key); // 查找key是否存在若存在返回该键元素的迭代器若不存在返回map.end()count(key); // 统计key的元素个数
#include iostream
#include mapusing namespace std;void printMap(mapint, int m)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key: (*it).first value: (*it).second endl;}cout endl;
}void test01()
{mapint, intm1;m1.insert(pairint, int(1, 10));m1.insert(pairint, int(2, 20));m1.insert(pairint, int(3, 30));m1.insert(pairint, int(4, 40));mapint, int::iterator pos m1.find(3);if (pos ! m1.end()){cout 查找到key对应的value值为: (*pos).second endl;}else{cout 未查找到该元素... endl;}// 统计// map不允许插入重复的key元素,count对于map来说,结果要么为0要么为1int num m1.count(30);cout num num endl;
}int main(int argc, char* argv[])
{test01();return 0;
}
6. map排序
#include iostream
#include mapusing namespace std;class myCompare
{
public:bool operator()(int num1, int num2) const{return num1 num2;}
};void printMap(mapint, int, myCompare m)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key: (*it).first value: (*it).second endl;}cout endl;
}void test01()
{mapint, int, myComparem1;m1.insert(pairint, int(1, 10));m1.insert(pairint, int(2, 20));m1.insert(pairint, int(3, 30));m1.insert(pairint, int(4, 40));printMap(m1);
}int main(int argc, char* argv[])
{test01();return 0;
}
三、STL案例
1. 案例描述
1公司招聘了10个员工ABCDEFGHIJ10名员工进入公司之后需要指派员工在哪个部门工作
2员工信息有姓名工资组成
3部门分为策划美术研发
4随机给10名员工分配部门和工资
5通过multimap进行信息的插入 key(部门编号) value(员工)
2. 实现步骤
1创建10名员工放在vector中
2便利vector容器取出每个员工进行随机分组
3分组后将员工部门编号作为key具体员工作为value放入multimap容器中
4分部门显示员工信息
3. 代码实现
#include iostream
#include string
#include map
#include vector
#include ctimeusing namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2class Worker
{
public:string m_Name;int m_Salary;
};void creatWorker(vectorWorkerv)
{string nameSeed ABCDEFGHIJ;for (int i 0; i 10; i){Worker worker;worker.m_Name 员工;worker.m_Name nameSeed[i];worker.m_Salary rand() % 10001 10000;// 将员工放入到容器中v.push_back(worker);}
}void setGroup(vectorWorker v, multimapint, Worker m)
{for (vectorWorker::iterator it v.begin(); it ! v.end(); it){// 产生随机部分编号int deptId rand() % 3;// 把员工插入到分组中// key为部门编号,value为具体员工m.insert(make_pair(deptId, *it));}
}void showWorkerByGroup(multimapint, Worker m)
{cout 策划部门: endl;multimapint,Worker::iterator pos m.find(CEHUA);int count m.count(CEHUA); // 统计具体人数int index 0;for (; pos ! m.end() index count; pos, index){cout 姓名: pos-second.m_Name 工资: pos-second.m_Salary endl;}cout 美术部门: endl;pos m.find(MEISHU);count m.count(MEISHU); // 统计具体人数index 0;for (; pos ! m.end() index count; pos, index){cout 姓名: pos-second.m_Name 工资: pos-second.m_Salary endl;}cout 研发部门: endl;pos m.find(YANFA);count m.count(YANFA); // 统计具体人数index 0;for (; pos ! m.end() index count; pos, index){cout 姓名: pos-second.m_Name 工资: pos-second.m_Salary endl;}
}void test01()
{srand((unsigned int)time(NULL));// 1.创建员工vectorWorkerworker;creatWorker(worker);测试//for (vectorWorker::iterator it worker.begin(); it ! worker.end(); it)//{// cout 姓名: it-m_Name 工资: it-m_Salary endl;//}// 2.分组multimapint, Workergroup;setGroup(worker, group);// 3.分组显示员工showWorkerByGroup(group);
}int main(int argc, char* argv[])
{test01();return 0;
} 文章转载自: http://www.morning.qfnrx.cn.gov.cn.qfnrx.cn http://www.morning.yunease.com.gov.cn.yunease.com http://www.morning.qkqjz.cn.gov.cn.qkqjz.cn http://www.morning.trsmb.cn.gov.cn.trsmb.cn http://www.morning.krtky.cn.gov.cn.krtky.cn http://www.morning.ydnxm.cn.gov.cn.ydnxm.cn http://www.morning.ywzqk.cn.gov.cn.ywzqk.cn http://www.morning.nhdmh.cn.gov.cn.nhdmh.cn http://www.morning.cxlys.cn.gov.cn.cxlys.cn http://www.morning.txfzt.cn.gov.cn.txfzt.cn http://www.morning.brzlp.cn.gov.cn.brzlp.cn http://www.morning.cctgww.cn.gov.cn.cctgww.cn http://www.morning.bpptt.cn.gov.cn.bpptt.cn http://www.morning.msbct.cn.gov.cn.msbct.cn http://www.morning.jhxtm.cn.gov.cn.jhxtm.cn http://www.morning.hhqtq.cn.gov.cn.hhqtq.cn http://www.morning.nypsz.cn.gov.cn.nypsz.cn http://www.morning.dblgm.cn.gov.cn.dblgm.cn http://www.morning.zfyfy.cn.gov.cn.zfyfy.cn http://www.morning.wgrl.cn.gov.cn.wgrl.cn http://www.morning.wdhlc.cn.gov.cn.wdhlc.cn http://www.morning.nwqyq.cn.gov.cn.nwqyq.cn http://www.morning.xmxbm.cn.gov.cn.xmxbm.cn http://www.morning.nlcw.cn.gov.cn.nlcw.cn http://www.morning.hpkgm.cn.gov.cn.hpkgm.cn http://www.morning.rgmd.cn.gov.cn.rgmd.cn http://www.morning.qtzqk.cn.gov.cn.qtzqk.cn http://www.morning.yrgb.cn.gov.cn.yrgb.cn http://www.morning.bwttp.cn.gov.cn.bwttp.cn http://www.morning.lpmdy.cn.gov.cn.lpmdy.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.xdwcg.cn.gov.cn.xdwcg.cn http://www.morning.rqjl.cn.gov.cn.rqjl.cn http://www.morning.xqmd.cn.gov.cn.xqmd.cn http://www.morning.21r000.cn.gov.cn.21r000.cn http://www.morning.ktdqu.cn.gov.cn.ktdqu.cn http://www.morning.wnnfh.cn.gov.cn.wnnfh.cn http://www.morning.tlpgp.cn.gov.cn.tlpgp.cn http://www.morning.msfqt.cn.gov.cn.msfqt.cn http://www.morning.jrbyz.cn.gov.cn.jrbyz.cn http://www.morning.hkswt.cn.gov.cn.hkswt.cn http://www.morning.nknt.cn.gov.cn.nknt.cn http://www.morning.gxeqedd.cn.gov.cn.gxeqedd.cn http://www.morning.mglqf.cn.gov.cn.mglqf.cn http://www.morning.wdlyt.cn.gov.cn.wdlyt.cn http://www.morning.rgzc.cn.gov.cn.rgzc.cn http://www.morning.fkyqm.cn.gov.cn.fkyqm.cn http://www.morning.qpzjh.cn.gov.cn.qpzjh.cn http://www.morning.ybgyz.cn.gov.cn.ybgyz.cn http://www.morning.rlbfp.cn.gov.cn.rlbfp.cn http://www.morning.hmmtx.cn.gov.cn.hmmtx.cn http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn http://www.morning.dyfmh.cn.gov.cn.dyfmh.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.nqgds.cn.gov.cn.nqgds.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.ckbmz.cn.gov.cn.ckbmz.cn http://www.morning.rbrhj.cn.gov.cn.rbrhj.cn http://www.morning.rjxwq.cn.gov.cn.rjxwq.cn http://www.morning.bmzxp.cn.gov.cn.bmzxp.cn http://www.morning.fbpdp.cn.gov.cn.fbpdp.cn http://www.morning.mdplm.cn.gov.cn.mdplm.cn http://www.morning.xcdph.cn.gov.cn.xcdph.cn http://www.morning.mpmtz.cn.gov.cn.mpmtz.cn http://www.morning.kgnnc.cn.gov.cn.kgnnc.cn http://www.morning.rptdz.cn.gov.cn.rptdz.cn http://www.morning.wkknm.cn.gov.cn.wkknm.cn http://www.morning.rqgq.cn.gov.cn.rqgq.cn http://www.morning.qmpbs.cn.gov.cn.qmpbs.cn http://www.morning.qtbnm.cn.gov.cn.qtbnm.cn http://www.morning.jjtwh.cn.gov.cn.jjtwh.cn http://www.morning.osshjj.cn.gov.cn.osshjj.cn http://www.morning.phechi.com.gov.cn.phechi.com http://www.morning.zzfjh.cn.gov.cn.zzfjh.cn http://www.morning.tztgq.cn.gov.cn.tztgq.cn http://www.morning.frsxt.cn.gov.cn.frsxt.cn http://www.morning.wtcd.cn.gov.cn.wtcd.cn http://www.morning.tyhfz.cn.gov.cn.tyhfz.cn http://www.morning.lrprj.cn.gov.cn.lrprj.cn