C嘎嘎入门篇:类和对象番外(时间类)
前文:
小编在前文讲述了类和对象的一部分内容,其中小编讲述过运算符重载这个概念以及一个时间类,当时小编讲的没有那么细致,下面小编将会讲述时间类来帮助各位读者朋友更好的去理解运算符重载,那么,代码时刻到~

目录
正文:
1.时间类
1.1.时间类的构造函数
1.2.时间类的拷贝构造函数
1.3.时间类的析构函数
1.4.时间类的赋值运算符重载
1.5.时间类的比较大小函数
1.5.1.等于运算符重载
1.5.2.大于运算符重载
1.5.3.大于等于运算符重载
1.5.4.不等于运算符重载
1.5.5.小于运算符重载
1.5.6.小于等于运算符重载
1.6..时间 +/+= 天数函数
1.6.1.获取天数的函数
1.6.2.+=天数函数
1.6.3.+天数函数
1.7.时间 -/-= 天数函数
1.7.1.-=天数函数
1.7.2.-天数函数
1.8.++/--函数
1.8.1.前置++运算符重载
1.8.2.后置++运算符
1.8.3.前置--运算符
1.8.4.后置--运算符
1.9.时间减去时间
2.代码展示
2.1.Date.h
2.2.Date.cpp
3.总结
正文:
1.时间类
在讲解时间类的诸多功能之前,各位读者朋友需要先去了解一下时间类的成员变量有什么,这个小编在之前写构造函数的时候讲到过,不过此时肯定还有读者朋友是第一次来看我的文章,所以小编重新说一下,时间类的成员变量其实是很简单的,通过名字我们就知道和时间有关,所以它的成员变量应该是:年(_year),月(_month),日(_day),它的代码如下图所示,现在小编已经讲述了成员变量如何去写了,下面我们开始功能的书写~
class Date
{
private:int _year;int _month;int _day;
};

1.1.时间类的构造函数
我们在写一个完整的类的时候,自然需要写这个类的构造函数,构造函数小编在之前的博客也讲过,简单来说就是让成员变量进行初始化的,当然小编那时候讲的构造函数还不是完全体构造函数,构造函数还有一个点小编没讲,对于这部分内容小编会在类和对象(3)这篇文章讲过,敬请期待,行了废话不多说,由于构造函数的难度系数没有这么大,小编就直接展示代码了:
Date(int year = 2024, int month = 9, int day = 20)//小编此时是带缺省值的构造函数,此时小编就以文章创作的日期作为缺省值了{_year = year;_month = month;_day = day;}
1.2.时间类的拷贝构造函数
我们写完了构造函数以后,自然也会有拷贝构造函数的书写,其实对于时间类这个类来说,拷贝构造函数是无须书写的,因为时间类的成员变量并没有涉及到资源的调用,都是内置类型,此时我们直接使用系统默认给我们生成的拷贝构造函数就好,内置类型我们仅需使用浅拷贝即可,对于一些资源的调用例如动态内存开辟的类型我们就必须写拷贝构造函数,不过此时时间类是为了让各位更好的去掌握之前学习的内容,所以小编就把之前讲的都写一遍了,此时拷贝构造函数也是比较容易的,我们仅需把形参中的x类类型对象的成员变量给予刚建立的对象即可,下面小编直接展示代码:
Date(const Date& x)//const是为了防止权力放大的问题{_year = x._year;_month = x._month;_day = x._day;}
1.3.时间类的析构函数
时间类的析构函数其实也无需去写的,因为我们没有牵扯到资源的开辟,所以我们无须自己去释放资源,内置类型系统是会帮助我们去进行销毁的,但是为了帮助各位读者朋友去理解析构函数,小编就简单写一个析构函数,析构函数的写法也是很容易,小编的方法就是直接把成员变量的值改为0即可,由于难度不大,小编直接展示代码:
~Date(){_year = _month = _day = 0;}
1.4.时间类的赋值运算符重载
赋值运算符重载是小编在上篇文章刚刚讲述的内容,对于赋值运算符来说,它其实和拷贝构造函数是类似的,如果一个类的成员变量是不需要开辟资源的话,那么完全可以不用去写,内置类型我们仅需浅拷贝就满足情况了,不过为了让各位读者朋友更好的去掌握赋值运算符重载,小编还是会去写(感觉这句话写的太多就显得我水字数了,等会各种功能的讲解小编就不叨叨这么多了),赋值运算符重载函数其实和拷贝构造长的是很像的,我们传过去的参数也是一个类类型的对象x,我们仅需把x的内容复制给要接受的对象,对于拷贝构造函数和赋值运算符重载小编在上篇文章也讲述了,感兴趣的读者朋友可以去看看,下面小编展示代码:
Date& operator=(const Date& x){_year = x._year;_month = x._month;_day = x._day;return *this; //记住一定要有返回值,有个人每次都忘记}
1.5.时间类的比较大小函数
在写这个比较大小的函数之前,小编先提前透露一下难度,当我们写完前两个运算符重载以后,剩下的会很简单,可能读者朋友会好奇,好奇就对了,下面跟着小编的脚步开启比较大小函数的书写~

1.5.1.等于运算符重载
首先我们重载的就是等于运算符,等于运算符的重载是在这一系列比较大小的函数中最为容易的,对于两个类的相等,如果两个;类的成员变量相等,那么这两个类就是相等的,由于难度不大,下面小编给各位读者朋友展示一下代码:
bool operator==(const Date& x){return _year == x._year && _month == x._month && _day == x._day; // 只有三个都成立了那么这个返回值就是真的,反之则就是假的}
1.5.2.大于运算符重载
大于运算符重载算是一个比较麻烦的运算符重载了,对于两个类的时间比大小,原理还是比较容易的,我们就拿这两个类类型的对象为A,B,如果A的年大于B的年,那么此时就说明A大于B,返回真;如果A的年和B的年相等,不过A的月大于B的月,那么就说明A大于B,返回真;如果A的年月和B的年月相等,不过此时A的日大于B的日,那么此时A大于B,返回真;以上情况都说明了A大于B,如果这几种情况都不符合的话,那么直接返回假即可,这便是大于运算符的重载,理解起来是很容易的,但是写起来是不容易的,我们得用多个if else语句,下面小编给出代码:
bool operator > (const Date& x){if (_year > x._year)return true;else if (_year == x._year && _month > x._month)return true;else if (_year == x._year && _month == x._month && _day > x._day)return true;return false;}
1.5.3.大于等于运算符重载
可能很多读者朋友在看完前面小编讲述的赋值运算符重载以后,可能现在很会快就想到解决方案,我们仅需复制上面的代码,然后把>全部改成>=就可以完成大于等于的操作,这个操作确实是正确的,不过也很复杂代码写起来,还记得小编在开头说的吗,我们仅需学完前两个函数,后面的函数会非常简单,下面小编就解释原因,对于后面的函数,我们仅需复用前面两个函数就可以解决所有的比较问题,就拿此时的大于等于举例子,大于等于的意思无非就是大于或者等于成立,各位读者朋友仔细想想,大于函数我们实现了没》等于函数我们实现了没?全都实现了,所以我们仅需通过或运算符去链接它们,即可完成大于等于运算符的重载,如下面的代码所示:
bool operator>=(const Date& x){return *this > x || *this == x;}
1.5.4.不等于运算符重载
想一想不等于的反义词是什么,那肯定是等于,等于运算符我们也写出来了,所以我们仅需让等于运算符取!,就可以实现不等于运算符重载,代码如下所示:
bool operator != (const Date& x){return !(*this == x);}
1.5.5.小于运算符重载
小于运算符重载的实现和上面不等于重载的原理是一样的,小于的相反是什么?那肯定是大于等于,大于等于的运算符我们重载了没?答:指定是重载了,所以我们仅需让大于等于运算符取反即可,是不是感觉实现完了前面两个函数,之后的函数有一种轻舟已过万重山的滋味?这便是代码的有趣之处,下面小编给出代码:
bool operator < (const Date& x){return !(*this >= x);}
1.5.6.小于等于运算符重载
这个小于等于的重载和上面几位仁兄的原理是一样的,此时我们仅需找到它的反,它的反是大于,我们仅需让大于操作符取反即可,下面展示代码:
bool operator <= (const Date& x){return !(*this > x);}
此时我们已经完成了比较功能的实现,是不是很轻松,下面我们继续往前走,开始更多功能的学习!

1.6..时间 +/+= 天数函数
1.6.1.获取天数的函数
在我们讲述时间+/+=天数函数之前,我们首先要先写一个确定每个月天数的函数,因为大家都知道,闰年和平年2月份的天数不一样,每个月的天数也不是一致的,所以此时我们需要自己写一个获取每个月天数的函数供我们使用,对于这个函数的描写其实很简单,我们可以先设置一个可以保存13个整形的数组,然后由于数组第一个元素的下标是0开头的,所以我们第一个元素不作数,其他的就是按照1到12月天数来算的,此时2月份我们设置29天,之后我们再写一个判断平年闰年的函数即可(这一个是我们在C语言阶段常常写的,小编就不详细介绍了),如果此时是2月并且是闰年,那么直接返回29;如果不是的话,直接返回对应下标的数组即可,下面小编给出函数:
inline int GetMonthday(int year,int month){static int arr[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 }; //设置为静态区的可以每次调用函数的时候不必再开辟一个数组if (month == 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)){return 29;}return arr[month];}
1.6.2.+=天数函数
下面我们就可以进行+=天数运算符的重载了,我们知道,就拿整型举例,1+=2 就是 1 + 2 ==3 ,此时直接让1加上2了,对于此时类+=天数,我们也是让类本身进行了改变,如果是1+2的话,是把1+2的结果给另一个整型,整型本身不发生变化,同样的,类+天数,类本身不发生变化这个要和+区别清楚,下面我们来讲述一下+=天数的原理:
此时小编的做法就是直接让对象的天数加上传过来的天数, 然后我们就要开始往后进位了,我们首先先让天数减当月的天数,然后让天数往后加一,之后我们需要判断此时的月份是否加到了13,如果是13,那么就让月份变为1,年往后+1,之后我们继续去减去当月的天数,此时我们就用到了循环,循环的条件自然是此时的天数应当大于当月的天数,在我们循环完以后,返回*this即可~此时我们的返回值类型是引用类类型,这样做是为了减少临时对象的产生,提高代码的效率,这个函数已经写完,下面小编给出这个函数的代码:
Date& operator+=(int day){_day += day;while (_day > GetMonthday(_year, _month)){_day -= GetMonthday(_year, _month);_month++;if (_month == 13){_month = 1;_year++;}}return *this;}
1.6.3.+天数函数
当我们写完上面那个运算符以后,这个函数其实就变的很简单了,我们还是复用了上面那个函数,首先我们需要在创建一个类对象,把*this拷贝赋值给它,之后我们让这个新建立的对象+=天数以后,返回这个新建对象即可,此时我们返回值类型是不能为引用类类型了,而是单纯的类类型,因为此时我们返回的内容是一块临时对象,此时这个新建立的类对象函数栈帧结束以后就销毁了,我们如果使用引用会造成野引用的问题,下面小编就展示+函数的写法:
Date operator+(int day){Date a = *this;a += day;return a;}
1.7.时间 -/-= 天数函数
1.7.1.-=天数函数
+=函数写完了,此时我们自然也有-=天数函数,下面废话不多说,小编直接讲述这个函数的写法:首先,我们直接让成员变量中的天数减去给我们的天数,之后我们就要采取借位的方法,首先我们先让——month减1,先判断此时的月份是否等于0,如果等于0的话,我们就让月份等于12,年份往后倒退一年,此时让天数+=当月的天数,然后我们依然采取循环的方式,此时的循环条件就是_day <= 0,之后循环结束以后,我们返回*this即可,此时我们的-=运算符就算是重载结束,下面小编给出代码:
Date& operator-=(int day){_day -= day;while (_day <= 0){_month--;if (_month == 0){_month = 12;_year--;}_day += GetMonthday(_year, _month);}return *this;}
1.7.2.-天数函数
此时这个函数的写法和上面的+写法如出一辙,只不过我们就把上面函数的+改成了-即可,小编就不多重复无用的话了,直接上代码:
Date operator-(int day){Date a = *this;a -= day;return a;}
1.8.++/--函数
在讲解++ / --运算符之前,小编先给各位读者朋友科普一个小小的知识点,关于如果区分前置++和后置++的问题,一个图片便可以让读者朋友们去了解到,如下图所示:

1.8.1.前置++运算符重载
对于前置++运算符,我们知道它的规则就是先+1后使用,所以我们可以先让它的本身+1 ,然后直接返回*this即可,此时就用到了我们上面刚刚实现过的+=天数函数了,从这我们又看出,我们前面都在为后面的学习铺路,下面小编展示代码:
Date& operator ++(){*this += 1;return *this;}
1.8.2.后置++运算符
后置++的运算法则是先使用后++,所以我们需要先设置一个对象来负责接受*this的值,然后我们让*this正常+1,之后返回刚刚设置的对象即可,并且它需要在括号内加个int和前置++区分,下面小编给出代码:
Date operator++(int){Date a = *this;*this += 1;return a;}
1.8.3.前置--运算符
对于前置--运算符,我们知道它的规则就是先-1后使用,所以我们可以先让它的本身-1 ,然后直接返回*this即可,此时就用到了我们上面刚刚实现过的-=天数函数了,从这我们又看出,我们前面都在为后面的学习铺路,下面小编展示代码:
Date& operator--(){*this -= 1;return *this;}
1.8.4.后置--运算符
后置++的运算法则是先使用后--,所以我们需要先设置一个对象来负责接受*this的值,然后我们让*this正常-1,之后返回刚刚设置的对象即可,并且它需要在括号内加个int和前置--区分,下面小编给出代码:
Date operator--(int){Date x = *this;*this -= 1;return x;}
1.9.时间减去时间
时间可以进行想减,但是不可以去相加,因为加起来是完全没意义的,但是减是有意义的,因为这常常用于计算两个日期之间的天数,就比如今天距离国庆还有多少天,此时小编写博客时间距离国庆还有10天,小编还是很期待国庆的,可以更好的去学习了(确信),行了不多说废话了,下面小编就要讲述这个的原理了:
此时我们需要先判断这两个时间的长短,所以先设置好两个对象,分别为a1,a2,首先我们先把长的时间给a1,短的给a2,对于判别长短的方法,小编在数据结构的快慢指针的时候就用到过,我们先默认设置一个对象就是长的,之后在做判断,此时我们还需要flag变量来控制正负,如果*this是大于给定的x的,那么此时就是正的,反之为负,并且我们还需要设置一个变量count,这个是来计数的,我们通过循环的方式,让短的不断++,直到++到长的,此时循环结束,我们也计算出了天数count,之后我们返回count*flag即可,这个方法小编认为还是比较容易理解的,同样的,我们也是用到了前面我们使用过的函数,下面小编给出代码:
int operator-(Date& s1){Date a1 = *this;Date a2 = s1;int flag = 1;if (a1 < a2){a1 = s1;a2 = *this;flag = -1;}int count = 0;while (a2 != a1){a2++;count++;}return count * flag;}
此时我们实现完了时间类,当然这个时间类是不太完整的,小编还有流插入和流提取函数还没有写完,不过小编不打算讲解这个了,等以后深入学习了cin和cout以后小编在回来补全这篇文章,免得写一个错的让各位读者朋友理解错了就不好了,下面小编展示完整的代码~
2.代码展示
2.1.Date.h
#include<iostream>using namespace std;
//现在开始来实现日期类的完整实现
class date
{
public:friend ostream& operator<<(ostream& out, date& s1); //因为要用到类里面的,所以我们要用友元函数,如果不这么做,会显得很奇怪friend istream& operator>>(istream& in, date& s1);//先来构造函数date(int year = 2024, int month = 8, int day = 12);//拷贝构造函数date(const date& s1);//析构函数~date();//赋值运算符重载date& operator=(const date& s1);bool operator<(const date& s1);bool operator<=(const date& s1);bool operator>(const date& s1);bool operator>=(const date& s1);bool operator==(const date& s1);bool operator!=(const date& s1);// 获取某年某月的天数int GetMonthDay(int year, int month){static int arr[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)){return 29;}return arr[month];}//写一个日期加天数(+=的实现,因为这样变化会导致本身发生变化)date& operator+=(int day);//实现+操作,此时不会导致本身变化date operator+(int day);//加实现完了就该实现减等了date& operator-=(int day);//实现完了减等就该实现减操作符了,此时本身不改变,不过一定记得此时返回的是一个里面创建的临时变量,不可以用&引用返沪了date operator-(int day);//通过打印来看看自己写的函数对不对//前置++date& operator++();//后置++,为了区分,里面得放一个int,这样才可以分辨出来date operator++(int);//前置--date& operator--();//后置--date operator--(int);//日期减日期int operator-(date& s1);void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;
};//还有个流插入操作符和流提取操作符ostream& operator<<(ostream& out,date& s1);
istream& operator>>(istream& in, date& s1);
2.2.Date.cpp
#include"date.h"date :: date(int year, int month , int day) //首先,缺省值只可以在函数声明中体现,其次想在这个文件使用定义就必须用::因为如果不用编译器不会去类域找
{_year = year;_month = month;_day = day;
}bool date :: operator<(const date& s1)
{if (_year < s1._year) //先比年,如果年就可以比出来直接结束{return true;}else if (_year == s1._year && _month < s1._month) //年如果相等直接比月,如果月可以比较出来直接结束{return true;}else if (_year == s1._year && _month == s1._month && _day < s1._day) //年月都相等,那就日{return true;}return false; //上面的情况都不符合那就只有你了
}bool date :: operator==(const date& s1)
{if (_year == s1._year && _month == s1._month && _day == s1._day)return true;return false;
}bool date :: operator<=(const date& s1)
{return (*this < s1 || *this == s1);
}bool date :: operator>(const date& s1)
{return !(*this <= s1); //运算符进行重复利用我们就可以实现剩余的比较,而不是成为一个ctrl cv大师
}bool date :: operator>=(const date& s1)
{return !(*this < s1);
}bool date :: operator!=(const date& s1)
{return !(*this == s1);
}date::date(const date& s1)
{_year = s1._year;_month = s1._month;_day = s1._day;
}date :: ~date()
{_year = 0;_month = 0;_day = 0;
}date& date:: operator=(const date& s1)
{_year = s1._year;_month = s1._month;_day = s1._day;return *this;
}date& date:: operator+=(int day)
{_day += day;if (_day < 0){*this -= -_day;}else{while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}}return *this;
}date date :: operator+(int day)
{date tmp = *this;tmp += day;return tmp;
}date& date :: operator-=(int day)
{_day -= day;if (_day > 0){*this += -_day;}else{while (_day <= 0){--_month;if (_month == 0){_month = 12;--_year;}_day += GetMonthDay(_year, _month);}}return *this;
}date date:: operator-(int day)
{date tmp = *this;tmp -= day;return tmp;
}date& date:: operator++()
{*this += 1;return *this; //前置++是先++后使用,所以直接返回加完后的就可以
}date date:: operator++(int)
{date tmp = *this;*this += 1;return tmp;
}date& date:: operator--()
{*this -= 1;return *this; //前置++是先++后使用,所以直接返回加完后的就可以
}date date:: operator--(int)
{date tmp = *this;*this -= 1;return tmp;
}int date:: operator-(date& s1)
{date a1 = *this;date a2 = s1;int flag = 1;if (a1 < a2){a1 = s1;a2 = *this;flag = -1;}int count = 0;while (a2 != a1){a2++;count++;}return count * flag;
}ostream& operator<<(ostream& out, date& s1)
{out << s1._year << "年" << s1._month << "月" << s1._day << "日" << endl;return out;
}istream& operator>>(istream& in, date& s1)
{cout << "请输入:";in >> s1._year >> s1._month >> s1._day;return in;
}
3.总结
这篇文章算是写完了,正如小编在文章所说,时间类就像冒泡排序一样,它们都是具有教学意义的,时间类帮我们去更好的巩固类的一些功能,小编写这篇文章写得很快,因为时间类我实现了好几次,因为写的快,所以文章难免会有一些错误,如果文章有错误的话,可以在评论区指出,小编一定会及时的回复信息,那么,我们下一篇博客见啦!

相关文章:
C嘎嘎入门篇:类和对象番外(时间类)
前文: 小编在前文讲述了类和对象的一部分内容,其中小编讲述过运算符重载这个概念以及一个时间类,当时小编讲的没有那么细致,下面小编将会讲述时间类来帮助各位读者朋友更好的去理解运算符重载,那么,代码时刻…...
Spring Boot项目实战教程:快速构建Web应用与RESTful API
目录 一、Spring Boot简介1、Spring Boot的定义2、Spring Boot的优势(1)快速开发(2)自动配置(3)微服务支持(4)无代码生成和XML配置(5)独立运行(6&…...
OpenAI 开发者大会!实时语音功能有API了,GPT-4o支持多模态微调,上下文cache功能上线
家人们!十一假期第1天, OpenAI一年一度的开发者大会又来了惹!今年的开发者大会分成三部分分别在美国、英国、新加坡三个地点举办,刚刚结束的是第一场。 去年的OpenAI开发者大会公布了GPT-4 Turbo和GPTs,今年没有大更新…...
解决ros2 rviz Fixed Frame No TF data问题
新建一个终端,然后输入 :map后的数字可以任意,100也可以。注意map与框架名称一致。 rosrun tf2_ros static_transform_publisher 0.0 0.0 0.0 0.0 0.0 0.0 map 5...
Python数据分析篇--NumPy--进阶
人有一种天生的、难以遏制的欲望,那就是在理解之前就评判。 -- 米兰昆德拉 多维数组 1. 一维数组只有行,二维数组相比一维数组多了列这个维度,而三维数组则类似多个二维数组堆叠在一起,形如一个立方体。 二维数组的创建 1. 二…...
基于Arduino的宠物食物分配器
创作本文的初衷是本人的一个养宠物的梦想(因为家里人对宠物过敏,因此养宠物的action一直没有落实),但是梦想总是要有的哈哈哈哈哈。上周正好是和一个很好的朋友见面,聊到了养宠物的事情,她大概是讲到了喂宠…...
make和Makefile
make是一个命令工具,用于读取并执行名为Makefile(makefile)的文件中定义的规则。 Makefile是一个文本文件,它告诉make哪些文件依赖于其他文件,以及如何从这些依赖项生成最终的目标文件。 我们先简单看一下使用make的…...
【数学分析笔记】第4章第4节 复合函数求导法则及其应用(2)
4. 微分 4.4 复合函数求导法则及其应用 【例4.4.3】 y e 1 cos x ye^{\sqrt{1\cos x}} ye1cosx ,求 y ′ y y′ 【解】 y ′ e 1 cos x ⋅ 1 2 1 cos x ⋅ ( − sin x ) − sin x 2 1 cos x e 1 cos x ye^{\sqrt{1\cos x}}\cdot\f…...
【预备理论知识——2】深度学习:线性代数概述
简单地说,机器学习就是做出预测。 线性代数 线性代数是数学的一个分支,主要研究向量空间、线性方程组、矩阵理论、线性变换、特征值和特征向量、内积空间等概念。它是现代数学的基础之一,并且在物理学、工程学、计算机科学、经济学等领域有着…...
【目标检测】yolo的三种数据集格式
目标检测中数据集格式之间的相互转换--coco、voc、yolohttps://zhuanlan.zhihu.com/p/461488682?utm_mediumsocial&utm_psn1825483604463071232&utm_sourcewechat_session【目标检测】yolo的三种数据集格式https://zhuanlan.zhihu.com/p/525950939?utm_mediumsocial&…...
数据分析案例-机器学习工程师薪资数据可视化分析
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
Django连接Dify、ChatGPT4o并计算tokens数量方法
通过Dify可以连接很多模型国内、国外的都可以进行选择可以到Dify里创建一个空白应用,然后点击进入就可以看到API了api_url "http://192.168.15.131/v1/chat-messages" api_key "app-UtzTpVNwpTLUcGvRNnnK9QNY" headers {"Authorization…...
面试系列-淘天提前批面试
00-淘天提前批面试 在牛客上看到了淘天提前批的面试题目,这里分析一下淘天面试的问了有哪些内容,面试的重点 是偏向哪些方面 项目相关 1、秒杀架构如何设计? 问了秒杀的架构如何设计,对于秒杀的设计,秒杀符合 写多读少…...
计算机中科学中有哪些空间换时间的操作??
计算机中科学中有哪些空间换时间的操作?? 1. SPOOLing (Simultaneous Peripheral Operations On-Line) 原理:SPOOLing 是一种将输入/输出操作缓存到磁盘或内存中的技术,从而在后台处理它们。这可以防止 CPU 等待慢速的外部设备&…...
Mac安装Manim并运行
1.在macOS上创建Python虚拟环境,可以使用venv模块,这是Python自带的库,也可以使用conda。以下是使用venv创建和使用Python虚拟环境的步骤: 打开终端。 创建一个新的目录来存放你的项目,并进入该目录: mk…...
leetcode58:最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1: 输入:s "Hello World" 输出ÿ…...
18448 最小生成树
### 思路 使用Kruskal算法求解图的最小生成树。Kruskal算法通过对所有边按权值排序,然后逐步选择最小权值的边,确保不会形成环,直到构建出最小生成树。 ### 伪代码 1. 读取输入的结点数n和边数m。 2. 读取每条边的信息,存储在边列…...
前端工程化 - Vue
环境准备 Vue-cli是Vue官方提供的一个脚手架,用户快速生成一个Vue的项目模板。 Vue-cli提供了如下功能: 统一的目录结构本地调试热部署单元测试集成打包上线 需要安装Node.js 安装Vue-cli npm install -g vue/cli通过vue --version指令查看是否安装成…...
使用 NVIDIA H100 上的 Azure 机密计算释放隐私保护 AI 的潜力
通过 NVIDIA H100 上的 Azure 机密计算释放隐私保护 AI 的潜力 文章目录 前言一、机密计算二、使用 NVIDIA H100 Tensor Core GPU 的 Azure 机密计算1. 安全功能2. 可扩展性和可编程性三、场景1. 模型机密性2. 推理/提示机密性3. 使用私有数据进行微调4. 多方培训结论前言 这是…...
目标检测与图像分类:有什么区别?各自的使用场景是什么?
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
