![](https://cos-cdn.shuashuati.com/pipixue-wap/2020-1230-1107-56/ti_inject-812ce.png)
本题源文件可直接下载资料区"stl应用_自定义数据类型的排序_程序填空.cpp" /* 对于自定义数据类型如结构体数据,同样默认是less
(即小于关系函数)作为关系函数,但需要重载该函数。 另外还可以自己定义关系函数()。在这些重载函数或者关系函数中指定数据的排序顺序(按哪些结构体成员排序,是递增还是递减)。 归纳起来,实现排序时主要有两种方式: 方式1:在声明结构体类型中重载 小于号< 运算符或 大于号> 运算符,以实现按指定成员的递增或者递减排序。 如sort(myv.begin(),myv.end())调用默认<运算符对myv容器的所有元素实现排序。 方式2:自己定义关系函数(),以实现按指定成员的递增或者递减排序。 如sort(myv.begin(),myv.end(),Cmp())调用Cmp的()运算符对myv容器的所有元素实现排序。 */ #include
#include
#include
using namespace std; struct Stud//定义学生类 { int no; // 学号 string name;// 姓名 Stud(int no1, string name1) //构造函数 { no = no1; name = name1; } bool operator<(const Stud &s) const //方式1:重载 小于号< 运算符, 两个学生谁的学号小, 谁就小 { return no < s.no; } bool operator>(const Stud &s) const //方式1:重载 大于号> 运算符, 两个学生谁的学号大, 谁就大 { _________(注: 第1个空, 1条语句) } }; struct CmpName { bool operator()(const Stud &s,const Stud &t) const//方式2:定义关系函数(), 两个学生谁的姓名小, 谁就小 { return s.name < t.name; } }; void Disp(vector
&myv) //输出vector的元素 { vector
::iterator it; //定义正向迭代器 for(it = myv.begin(); _________(注: 第2个空, 1个表达式); it ++) printf("[%d, %s] ", it->no, it->name.c_str()); printf("\n"); } void main() { Stud a[] = { Stud(2, "Mary"), Stud(1, "John"), Stud(5, "Smith"), Stud(4, "Anna") };// 定义学生数组a _________(注: 第3个空, 1条语句);// 计算数组a中元素数量 vector
myv1(a, a + n);// 用a[0...n-1]初始化myv _________(注: 第4个空, 1条语句)// 用myv1构建新向量myv2 printf("初始myv1: "); Disp(myv1); //输出:[2, Mary] [1, John] [5, Smith] [4, Anna] sort(myv1.begin(), myv1.end()); //默认使用<运算符排序, 学号小的排在前面 printf("按学号递增排序: "); Disp(myv1); //输出:[1, John] [2, Mary] [4, Anna] [5, Smith] sort(myv1.begin(), myv1.end(), greater
()); // 反过来, 学号大的排在前面 printf("按学号递减排序: "); Disp(myv1); //输出:[5, Smith] [4, Anna] [2, Mary] [1, John] printf("初始myv2: "); Disp(myv2); //输出:[2, Mary] [1, John] [5, Smith] [4, Anna] sort(myv2.begin(), myv2.end(), CmpName()); //强制使用CmpName的()运算符函数比较元素 printf("按姓名递增排序: "); _________(注: 第5个空, 1条语句)//输出:[4, Anna] [1, John] [2, Mary] [5, Smith] }