生日备忘录(自定义排序)

题目:

实现简易的生日备忘录。温暖的亲情是前进的动力,别忘记在家人生日时送 去祝福。定义类 Member 描述家庭成员,每位家人有自己的姓名 name 和出生日期 birthday,出生日期应描 述为由 year、month、day 组成的 Date 类。在 main 函数中定义数组(或 STL 容器)存放家庭成员对象,并 调用类的成员函数,按照生日先后顺序输出各位家庭成员的信息。

方法:重载关系运算符

通过重载关系运算符进行自定义排序。

1.

先定义Date类,重载"<",使之能按照日期进行排序。同时重载输出"<<"使之能输出日期。

2.

定义Member类,第二次重载"<",使每个成员能按照生日的日期进行排序。同时可以再次  重载"<<",使之能输出家庭成员。

3.

经过两次对小于号的重载,我们现在已经可以使用sort(member,member+n)对成员进行排序。大致演化过程为:对member成员进行排序——>对member成员的日期进行排序(如果没有第二次对"<"号的重载,想达到相同效果,需要使用sort(member,member+n,comp),自定义comp按照生日日期排序)——>调用"<"的第一个重载对日期排序。

代码:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Date {
private:
	size_t year, month, day;
public:
	Date(size_t y = 0, size_t m = 0, size_t d = 0) :year(y), month(m), day(d) {}
	bool operator < (const Date& rhs) const {
		if (this->year < rhs.year)
			return true;
		else if (this->year == rhs.year && this->month < rhs.month)
			return true;
		else if (this->year == rhs.year && this->month == rhs.month
			&& this->day < rhs.day)
			return true;
		else
			return false;
	}
	friend ostream& operator << (ostream& os, const Date& rhs) {
		os << rhs.year << "-" << rhs.month << "-" << rhs.day;
		return os;
	}
}; 
class Member {
private:
	string name;
	Date birthday;
	
public:
	Member(const char* n = "", size_t y = 0, size_t m = 0, size_t d = 0)
		:name(n), birthday(y, m, d) {}
	bool operator < (const Member& rhs) const {
		return this->birthday < rhs.birthday;
	}
	friend ostream& operator << (ostream& os, const Member& rhs) {
		os << rhs.name << ": " << rhs.birthday;
		return os;
	}
}; 
int main() {
	Member m[]{ Member{"father", 1980, 6, 12}, Member{"mother", 1982, 2, 28},
	Member{"son", 2002, 1, 1} };
	sort(m, m + size(m));
	for (auto x : m)
		cout << x << endl;
}

 运行结果:

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hz2.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值