## 今天学了什么今天学习C中STL-常用拷贝替换/算术生成/集合算法并结合所学STL完成两个案例。## 常用的拷贝和替换算法copy(v1.begin(), v1.end(), v2.begin()); //拷贝replace(v.begin(), v.end(), oldValue, newValue); //替换replace_if(v.begin(), v.end(), _Pred, val); //按条件替换swap(v1, v2); //两个容器互换 必须同种类型## 常用算术生成算法accumulate(v.begin(), v.end(), val); //计算容器内元素累计总和 返回 int val为起始累加值fill(v.begin(), v.end(), val); // 按val填充## 常用集合算法set_intersection(v.begin(), v.end(), v2.begin(), v2.end(), vT.begin()); //交集 大小minset_union(v.begin(), v.end(), v2.begin(), v2.end(), vT.begin()); //并集大小v1.size()v2.size()set_difference(v.begin(), v.end(), v2.begin(), v2.end(), vT.begin()); //差集 大小v.size()使用该类算法注意事项必须确保两个集合是有序的必须先规定接收容器的大小返回值 返回结果最后一个元素的位置## 练习** 员工分组 **要求• 公司今天招聘了10个员工ABCDEFGHIJ10名员工进入公司之后需要指派员工在哪个部门工作• 员工信息有: 姓名、工资组成部门分为策划、美术、研发• 随机给10名员工分配部门和工资• 通过multimap进行信息的插入key(部门编号)value(员工)• 分部门显示员工信息案例分析定义一个员工类Woker 包含姓名和工资使用vector容器存放10名员工利用for循环创建10名员工对象随机生成工资信息并存放到vector中遍历vector容器随机生成部门编号0策划1美术2研发通过multimap进行信息绑定key(部门编号)value(员工)遍历multimap打印员工信息。代码如下#includeiostream using namespace std; #includevector #includemap #define Planning 0 #define Art 1 #define RD 2 class Woker { public: string woker_name; int woker_salary; }; void createWoker(vectorWoker w) { string num ABCDEFGHUIJ; for (int i 0; i 10; i) { Woker wk; wk.woker_name 员工; wk.woker_name num[i]; wk.woker_salary rand() % 10001 10000; w.push_back(wk); } } void MakeDepartment(const vectorWoker w) { multimapint, Woker Part_woker; for (vectorWoker::const_iterator it w.begin(); it ! w.end(); it) { int ptmId rand() % 3; Part_woker.insert(make_pair(ptmId, *it)); } for(multimapint,Woker::iterator it Part_woker.begin();it! Part_woker.end();it) { if (it-first Planning) { cout 策划部: 姓名 it-second.woker_name 工资 it-second.woker_salary endl; } else if (it-first Art) { cout 美术部: 姓名 it-second.woker_name 工资 it-second.woker_salary endl; } else if (it-first RD) { cout 开发部: 姓名 it-second.woker_name 工资 it-second.woker_salary endl; } } } void test() { srand((unsigned int)time(nullptr)); vectorWoker wk; createWoker(wk); MakeDepartment(wk); } int main() { test(); return 0; }测试结果编译运行10名员工分部门打印员工信息。** 学生成绩管理系统 **要求· 添加学生姓名 成绩;· 按姓名查成绩;· 计算班级平均分· 按成绩排序升序/降序;· 删除学生· 显示所有学生案例分析定义一个学生类Student 包含姓名和成绩使用vector容器存放学生利用for循环创建学生对象随机生成成绩并存放到vector中利用sort算法#includealgorithm给学生按成绩降序排列利用find_if查找对应学生的成绩找到则打印成绩仿函数/普通函数优先仿函数方便动态使用利用erase删除学生对象利用accumulate#includenumeric统计班级总分用于求班级平均分遍历vector容器打印学生信息代码如下#includeiostream using namespace std; #includevector #includealgorithm #includenumeric class Student { public: string stu_name; int stu_score; }; //创建学生 void createScore(vectorStudent s) { string name[] {张飞,刘备,赵云,安琪拉,韩信,李元芳,狄仁杰,关羽,姜子牙,蔡文姬}; for (int i0;i10;i) { Student stu; stu.stu_name name[i]; stu.stu_score rand() % 41 60; s.push_back(stu); } } //遍历打印学生成绩 void printStudent(const vectorStudent vs) { for (vectorStudent::const_iterator it vs.begin(); it ! vs.end(); it) { cout 学生姓名 it-stu_name 成绩 it-stu_score endl; } } //按姓名查找学生成绩 bool findScore(const Student s) { return s.stu_name 张飞; } class StudentScore { public: StudentScore(string n) :name(n) {}; //按姓名查找学生成绩 bool operator()(const Student s)//Studentscore a(张飞) a.operator()(s)a(s) { return s.stu_name this-name; } string name; }; void test() { vectorStudent v; //创建学生信息 createScore(v); //printStudent(v); //cout endl; //按成绩排序 从高到低 sort(v.begin(), v.end(), [](const Student s1, const Student s2) { return s1.stu_score s2.stu_score; }); printStudent(v); cout endl; //按姓名查找学生成绩 //vectorStudent::iterator it find_if(v.begin(), v.end(), findScore); vectorStudent::iterator it find_if(v.begin(), v.end(), StudentScore(刘备)); if (it ! v.end()) { cout it-stu_name 的成绩为 it-stu_score 分。 endl; } else { cout 没有查到该学生的成绩 endl; } cout endl; //删除学生 //v.erase(v.begin() 2); vectorStudent::iterator N find_if(v.begin(), v.end(), StudentScore(赵云)); if (N ! v.end()) v.erase(N); cout 删除后学生信息 endl; printStudent(v); cout endl; //求班级平均分 int numaccumulate(v.begin(), v.end(), 0, AddScore); int aver num / v.size(); cout 班级平均分为 aver endl; } int main() { srand((unsigned int)time(nullptr)); test(); return 0; }测试结果编译运行成功创建学生信息排序、查找、删除功能无误。补充在删除学生时先判断学生是否存在用使用find_if查找学生姓名找到返回迭代器it后利用eraseit更安全。