C++设计一:日期类Date实现
一、引言与概述
1 引言
日期操作是软件开发中的常见需求,如日程管理、数据统计等场景均需处理日期的比较、偏移及合法性校验。为简化此类操作,本文设计了一个高效且类型安全的C++日期类Date
。
该类通过构造函数内嵌合法性检查,确保对象初始状态的正确性;借助运算符重载,用户可直观使用d1 > d2
、d += 30
等语法进行逻辑判断与日期计算,显著提升代码可读性。内部方法GetMonthDay
结合静态数组与闰年规则,动态适配不同月份的天数变化,解决了跨月运算的复杂性。
代码结构分为头文件声明与实现文件,测试函数TestDate1
和TestDate2
覆盖了核心功能的验证,包括运算符逻辑、日期加减及自增行为。本文的实现兼顾效率与安全性(如const
引用传参),为日期相关功能提供了可靠的底层支持。
2 概述
本文设计并实现了一个基于C++的日期类Date
,支持日期的基本操作与运算。类核心功能包括:
-
日期合法性校验:构造函数自动检测年、月、日的有效性,对非法日期输出警告。
-
运算符重载:提供完整的比较运算符(
==
、!=
、>
、<
等)、日期加减运算(+
、+=
、-
、-=
)及自增操作(前置/后置++
),使日期操作更符合直觉。 -
智能月份天数计算:通过私有方法
GetMonthDay
动态判断闰年与各月份天数,确保跨月、跨年运算的准确性。 -
测试验证:包含测试用例
TestDate1
和TestDate2
,验证比较逻辑、日期增减及边界条件处理的正确性。
代码采用面向对象设计,通过封装与运算符重载提升易用性,适用于需日期处理的应用程序开发。
二、Date头文件的设计
头文件 Date.h
是整个日期类的核心声明文件,其设计遵循面向对象封装原则,通过合理划分公有接口与私有实现,确保类的安全性与易用性。以下从结构、功能与设计细节三个层面详细说明头文件的设计思路。
1. 头文件结构
头文件主要包含以下部分:
-
预处理指令:
#pragma once #include <iostream> using std::cout; using std::endl;
-
#pragma once
:防止头文件重复包含,保证编译安全性。 -
仅包含必要的输入输出流头文件
<iostream>
,避免冗余依赖。 -
使用
using
声明简化cout
和endl
的调用,提升代码简洁性。
-
-
类声明:
class Date { public: // 构造函数与成员函数声明 private: // 成员变量与私有方法声明 };
-
明确划分
public
与private
区域:-
公有接口:暴露构造函数、打印函数及运算符重载,供外部调用。
-
私有实现:隐藏成员变量
_year
、_month
、_day
及辅助方法GetMonthDay
,防止外部直接修改内部状态。
-
-
2. 类成员设计
(1) 成员变量
private: int _year; int _month; int _day;
-
命名规范:采用
_
前缀标识成员变量(如_year
),与构造函数参数year
区分,增强可读性。 -
数据封装:私有属性禁止外部直接访问,确保日期状态的完整性,避免非法修改。
(2) 构造函数
Date(int year = 1, int month = 1, int day = 1);
-
默认参数:提供默认值(1年1月1日),支持无参构造(如
Date d;
)。 -
参数校验:
-
在构造函数内部检查年、月、日的合法性:
if (!(year >= 1 && (month >= 1 && month <= 12) && ... )) cout << "非法日期" << endl;
-
确保对象初始状态有效,防止无效日期被创建。
-
(3) 成员函数
-
打印函数:
void Print();
提供标准化的日期输出格式(如
2025/3/2
),便于调试与展示。 -
运算符重载:
// const 引用参数:提升效率并防止参数被意外修改。 bool operator==(const Date& d); bool operator!=(const Date& d); bool operator>(const Date& d); // d1 > d2 bool operator>=(const Date& d); // d1 >= d2 bool operator<=(const Date& d); bool operator<(const Date& d);Date& operator+=(int day); // d1 += day Date operator+(int day); // d1 + day Date& operator-=(int day); // d1 -= day Date operator-(int day); // d1 - day Date& operator++(); // 前置 Date operator++(int); // 后置
-
逻辑运算符(
==
、>
等):支持日期的直接比较(如d1 > d2
)。 -
算术运算符(
+=
、+
等):实现日期的增减运算(如d1 += 30
)。 -
参数传递:使用
const
引用(const Date& d
)避免拷贝开销,同时防止参数被修改。
-
(4) 私有辅助方法
int GetMonthDay(int year, int month);
-
功能:根据年份和月份动态返回当月天数,自动处理闰年二月(29天)。
-
实现细节:
-
静态数组
monthDayArray
存储非闰年各月天数,减少重复计算。 -
通过闰年规则判断二月天数,提升计算效率。
-
3. 关键设计细节
-
运算符复用:
-
通过复用已有运算符减少冗余代码。例如:
bool operator!=(const Date& d) { return !(*this == d); } bool operator<=(const Date& d) { return !(*this > d); }
-
提高代码可维护性,避免逻辑不一致。
-
-
前置与后置自增:
Date& operator++(); // 前置++(返回引用) Date operator++(int); // 后置++(返回临时对象)
-
通过
int
参数区分前置与后置运算符,符合C++标准语法。 -
前置自增直接修改对象并返回引用,后置自增返回旧值的副本,保证语义正确性。
-
-
异常处理策略:
-
构造函数检测到非法日期时仅输出警告,未抛出异常,需由调用者确保输入的合法性。
-
可根据需求扩展为抛出异常,增强健壮性。
-
4. 设计优势
-
高内聚低耦合:日期计算逻辑封装在类内部,外部仅通过接口调用,降低依赖。
-
语法直观性:运算符重载使日期操作符接近内置类型(如
d1 == d2
),提升代码可读性。 -
效率优化:通过引用传递、静态数组缓存天数,减少运行时开销。
该头文件的设计兼顾功能完备性与代码简洁性,为日期操作提供了高效、安全的抽象层。
三、函数实现
本节详细解析 Date
类的核心函数实现,涵盖运算符重载、日期运算逻辑及关键设计细节,确保代码功能正确性与效率优化。
1. 比较运算符重载
(1) operator==
与 operator!=
bool Date::operator==(const Date& d)
{return _year == d._year&& _month == d._month&& _day == d._day;
}
bool Date::operator!=(const Date& d)
{// 当调用 d1!=d2 时,d1 是调用该成员函数的对象,因此 this 指向 d1。// 等价于 d1.operator==(d2)return !(*this == d);
}
-
功能:直接比较日期的年、月、日是否全等。
-
设计亮点:通过
operator!=
复用operator==
逻辑,避免冗余代码。
(2) operator>
与 <
系列运算符
bool Date::operator>(const Date& d)
{if (_year > d._year) return true;else if (_year == d._year && _month > d._month) return true;else if (_year == d._year && _month == d._month && _day > d._day) return true;else return false;
}
bool Date::operator>=(const Date& d)
{return (*this > d) && (*this == d);
}
bool Date::operator<(const Date& d)
{return !(*this >= d);
}bool Date::operator<=(const Date& d)
{return !(*this > d);
}
-
关键逻辑:按年→月→日优先级逐级比较,确保判断顺序正确。
2. 日期加减运算
(1) operator+=
与 operator+
Date& Date::operator+=(int day)
{if (day < 0){return *this -= (-day);}_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){_year++;_month = 1;}}return *this;
}
Date Date::operator+(int day)
{Date& ret(*this);ret += day;return ret;
}
-
核心算法:
-
通过循环逐月扣除天数,处理跨月、跨年场景。
-
调用
GetMonthDay
动态获取当月天数,适配闰年规则。
-
(2) operator-=
与 operator-
Date& Date::operator-=(int day)
{if (day < 0){return *this += (-day);}_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}Date Date::operator-(int day)
{Date& ret(*this);ret -= day;return ret;
}
-
逆向运算逻辑:逐月回溯天数,处理跨月、跨年问题。
-
边界处理:当
_day
减为负数时,调整月份并补足上月天数。
3. 自增运算符
(1) 前置 operator++
Date& Date::operator++()
{*this += 1;return *this;
}
-
行为:直接修改对象,日期加1天后返回自身引用。
(2) 后置 operator++
// 后置 -- 多一个int参数主要是为了根前置区分
// 构成函数重载
Date Date::operator++(int)
{Date tmp(*this);*this += 1;return tmp;
}
-
行为:先保存原对象状态,再自增,最后返回旧值副本。
-
语法特性:通过
int
参数区分前置与后置运算符。
4. 辅助函数 GetMonthDay
// 函数:获取某年某月的天数
int GetMonthDay(int year, int month)
{// 定义静态变量:每月天数static int monthDayArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };// 闰年二月有 29 天if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) return 29;else return monthDayArray[month];
}
-
功能:根据年份和月份返回当月天数,自动处理闰年二月。
-
优化设计:
-
使用静态数组缓存非闰年月份天数,减少重复初始化开销。
-
闰年判断规则符合格里高利历标准。
-
5. 测试函数设计
(1) 测试逻辑运算符(TestDate1
)
void TestDate1()
{/* 测试 == != > >= < <= */Date d1(2025, 3, 2);Date d2(d1);Date d3(2025, 3, 1);// == 等于if (d1 == d2) cout << "==" << endl;else cout << "!==" << endl;// != 不等于if (d1 != d3) cout << "!=" << endl;else cout << "!!=" << endl;// > 大于if (d1 > d3) cout << ">" << endl;else cout << "!>" << endl;// >= 不大于等于if (d3 >= d1) cout << ">=" << endl;else cout << "!>=" << endl;// < 小于if (d3 < d1) cout << "<" << endl;else cout << "!<" << endl;// < 不小于等于if (d1 <= d3) cout << "<=" << endl;else cout << "!<=" << endl;
}
-
覆盖场景:相等日期、相邻日期、跨月边界条件。
-
测试结果:
(2) 测试日期运算(TestDate2
)
void TestDate2()
{/* 测试 += + -= - 前置++ 后置++ */ Date d1(2025, 3, 2);Date d2(d1);Date d3(2025, 3, 1);Date d4(d3);Date d5(2025, 2, 28);// +=30 2025.4.1d1 += 30;d1.Print();// + 31 2025.4.2d2 + 31;d2.Print();// -= 31 2025.1.29d3 -= 31;d3.Print();// - 31 2025.1.29d4 - 31;d3.Print();// 1 2025.3.1d5++;d5.Print();// 1 2025.3.2++d5;d5.Print();
}
-
关键测试点:
-
跨月运算(如
+=30
导致3月→4月)。 -
闰年二月处理(
d5++
从2月28日到3月1日)。 -
运算符链式调用(如
d5++
与++d5
的区别)。
-
-
测试结果:
四、总结与展望
1. 项目总结
本文设计的 Date
类通过面向对象思想与运算符重载技术,实现了日期的核心操作功能,具有以下特点:
-
语法直观性:通过运算符重载(如
d1 += 30
、d1 > d2
),使日期操作符的语义接近内置类型,提升代码可读性。 -
高效性与安全性:
-
使用
const
引用传递参数,避免不必要的拷贝开销。 -
私有方法
GetMonthDay
结合静态数组与闰年规则,高效计算月份天数。
-
-
边界处理能力:支持跨月、跨年的日期运算(如从2月28日加1天到3月1日)。
-
可扩展性:通过封装成员变量与公有接口分离,便于后续功能扩展。
测试验证:
-
TestDate1
验证了比较运算符的逻辑正确性。 -
TestDate2
覆盖了日期加减、自增运算符的边界场景(如月份进位)。
2. 未来展望
为提升 Date
类的健壮性与功能性,可从以下方向优化:
功能增强:
-
扩展日期运算:
-
实现日期差计算(如
d1 - d2
返回相差天数)。 -
支持周数计算、星期获取(如
GetWeekDay()
返回周几)。
-
-
格式化输出:
-
支持多种日期格式(如
YYYY-MM-DD
、DD/MM/YYYY
)。 -
添加国际化支持(如中英文月份名称)。
-
性能优化:
-
缓存优化:将
GetMonthDay
的静态数组改为全局常量,避免重复初始化。 -
运算符复用:通过模板或宏进一步减少比较运算符的冗余代码。
兼容性扩展:
-
与标准库集成:兼容
std::chrono
库,支持时间戳转换与时区处理。 -
序列化支持:添加
Serialize()
与Deserialize()
方法,支持日期对象的持久化存储。
测试完善:
-
边界测试:覆盖闰年2月29日、12月31日+1天、1月1日-1天等极端场景。
-
模糊测试:随机生成大规模日期数据,验证运算逻辑的鲁棒性。
3. 结语
本文实现的 Date
类为C++日期操作提供了简洁高效的解决方案,其设计兼顾语法友好性与计算准确性,适用于日历应用、数据分析等场景。通过持续优化异常处理、扩展功能边界,并结合现代C++特性(如移动语义、constexpr
计算),可进一步提升其工程价值。该类的设计思想亦可为其他自定义类型的开发提供参考,体现了面向对象编程在复杂逻辑抽象中的核心优势。
五、完整代码展示
1.Date.h
#pragma once
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
class Date
{
public:// 构造函数Date(int year = 1, int month = 1, int day = 1){// _year是类的成员变量用于存储对象的状态, year为构造函数类的参数用于传递外部值到成员变量_year = year;_month = month;_day = day;// 检查日期是否合法if (!(year >= 1 // 年&& (month >= 1 && month <= 12) // 月&& (day >= 1 && day <= GetMonthDay(year, month)))) // 日{cout << "非法日期" << endl;}}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}// const 引用参数:提升效率并防止参数被意外修改。bool operator==(const Date& d);bool operator!=(const Date& d);bool operator>(const Date& d); // d1 > d2bool operator>=(const Date& d); // d1 >= d2bool operator<=(const Date& d);bool operator<(const Date& d);Date& operator+=(int day); // d1 += dayDate operator+(int day); // d1 + dayDate& operator-=(int day); // d1 -= dayDate operator-(int day); // d1 - dayDate& operator++(); // 前置Date operator++(int); // 后置
private:int _year;int _month;int _day;// 函数:获取某年某月的天数int GetMonthDay(int year, int month){// 定义静态变量:每月天数static int monthDayArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };// 闰年二月有 29 天if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) return 29;else return monthDayArray[month];}
};
2.Date.cpp
#include "Date.h"bool Date::operator==(const Date& d)
{return _year == d._year&& _month == d._month&& _day == d._day;
}
bool Date::operator!=(const Date& d)
{// 当调用 d1!=d2 时,d1 是调用该成员函数的对象,因此 this 指向 d1。// 等价于 d1.operator==(d2)return !(*this == d);
}
bool Date::operator>(const Date& d)
{if (_year > d._year) return true;else if (_year == d._year && _month > d._month) return true;else if (_year == d._year && _month == d._month && _day > d._day) return true;else return false;
}
bool Date::operator>=(const Date& d)
{return (*this > d) && (*this == d);
}
bool Date::operator<(const Date& d)
{return !(*this >= d);
}bool Date::operator<=(const Date& d)
{return !(*this > d);
}Date& Date::operator+=(int day)
{if (day < 0){return *this -= (-day);}_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){_year++;_month = 1;}}return *this;
}
Date Date::operator+(int day)
{Date& ret(*this);ret += day;return ret;
}Date& Date::operator-=(int day)
{if (day < 0){return *this += (-day);}_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}Date Date::operator-(int day)
{Date& ret(*this);ret -= day;return ret;
}Date& Date::operator++()
{*this += 1;return *this;
}// 后置 -- 多一个int参数主要是为了根前置区分
// 构成函数重载
Date Date::operator++(int)
{Date tmp(*this);*this += 1;return tmp;
}
3. Test.cpp
#include "Date.h"void TestDate1()
{/* 测试 == != > >= < <= */Date d1(2025, 3, 2);Date d2(d1);Date d3(2025, 3, 1);// == 等于if (d1 == d2) cout << "==" << endl;else cout << "!==" << endl;// != 不等于if (d1 != d3) cout << "!=" << endl;else cout << "!!=" << endl;// > 大于if (d1 > d3) cout << ">" << endl;else cout << "!>" << endl;// >= 不大于等于if (d3 >= d1) cout << ">=" << endl;else cout << "!>=" << endl;// < 小于if (d3 < d1) cout << "<" << endl;else cout << "!<" << endl;// < 不小于等于if (d1 <= d3) cout << "<=" << endl;else cout << "!<=" << endl;
}
void TestDate2()
{/* 测试 += + -= - 前置++ 后置++ */ Date d1(2025, 3, 2);Date d2(d1);Date d3(2025, 3, 1);Date d4(d3);Date d5(2025, 2, 28);// +=30 2025.4.1d1 += 30;d1.Print();// + 31 2025.4.2d2 + 31;d2.Print();// -= 31 2025.1.29d3 -= 31;d3.Print();// - 31 2025.1.29d4 - 31;d3.Print();// 1 2025.3.1d5++;d5.Print();// 1 2025.3.2++d5;d5.Print();
}int main()
{//TestDate1();TestDate2();return 0;
}
相关文章:
C++设计一:日期类Date实现
一、引言与概述 1 引言 日期操作是软件开发中的常见需求,如日程管理、数据统计等场景均需处理日期的比较、偏移及合法性校验。为简化此类操作,本文设计了一个高效且类型安全的C日期类Date。 该类通过构造函数内嵌合法性检查,确保对象初始状…...
关于2023新版PyCharm的使用
考虑到大家AI编程的需要,建议大家安装新版Python解释器和新版PyCharm,下载地址都可以官网进行: Python:Download Python | Python.org(可以根据需要自行选择,建议选择3.11,保持交流版本一致&am…...
【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (14) – 搭建Medallion Architecture part 2 前言 ADB 除了UC 这个概念之外,前面【Azure 架构师学习笔记】- Azure Databricks (1…...
一文了解Conda使用
一、Conda库频道 conda的软件频道是存储软件包的远程位置,当在Conda中安装软件包时,它会从指定的频道中下载和提取软件包。频道包含了各种软件包,不同的频道可能提供不同版本的软件包,用户可以根据需要选择适合的版本。 常见 Co…...
SP导入智能材质球
智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新...
记录一次Spring事务失效导致的生产问题
一、背景介绍 公司做的是“聚合支付”业务,对接了微信、和包、数字人民币等等多家支付机构,我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时,需要做对账功能,即支付机构将对账文件给到…...
腾讯云物联网平台(IoT Explorer)设备端使用
1、直接看图流程 2、跑起来demo,修改产品id,设备名称,设备秘钥。 3、连接部分 4、修改默认地址和端口 sdk里面的地址默认是带着产品ID拼接的,咱们现在中铁没有泛域名解析,要改下这里。把+productID都去掉,然后地址里的.也去掉。...
ML.NET库学习023: ONNX Runtime 中 C++ 辅助函数解析:Span 类与张量操作
文章目录 ML.NET库学习023: ONNX Runtime 中 C 辅助函数解析:Span 类与张量操作主题项目主要目的和原理项目概述实现的主要功能关键函数代码结构 主要功能与步骤Span 类的实现张量大小计算数据加载与处理准确性评估 数据集的使用以下是逐步解释ÿ…...
利用opencv_python(pdf2image、poppler)将pdf每页转为图片
1、安装依赖pdf2image pip install pdf2image 运行.py报错,因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载: github: Releases oschwartz10612/poppler-windows GitHub 百度网盘: 百度网盘…...
告别GitHub连不上!一分钟快速访问方案
一、当GitHub抽风时,你是否也这样崩溃过? 😡 npm install卡在node-sass半小时不动😭 git clone到90%突然fatal: early EOF🤬 改了半天hosts文件,第二天又失效了... 根本原因:传统代理需要复杂…...
学习DeepSeek V3 与 R1 核心区别(按功能维度分类)
一、定位与架构 V3(通用型模型) 定位:多模态通用大模型,擅长文本生成、多语言翻译、智能客服等多样化任务12。架构:混合专家(MoE)架构,总参数 6710 亿,每次…...
Linux总结
1 用户与用户组管理 1.1 用户与用户组 //linux用户和用户组 Linux系统是一个多用户多任务的分时操作系统 使用系统资源的用户需要账号进入系统 账号是用户在系统上的标识,系统根据该标识分配不同的权限和资源 一个账号包含用户和用户组 //用户分类 超级管理员 UID…...
web高可用集群项目(数据库主从同步、文件共享存储、nginx动静分离+负载均衡+高可用)
一、项目环境 二、环境准备 主机名IP地址备注openEuler-1192.168.121.11主负载调度器openEuler-2192.168.121.12副负载调度器openEuler-3192.168.121.13web-1(静态)openEuler-4192.168.121.14web-2(静态)openEuler-5192.168.121.…...
如何快速上手RabbitMQ 笔记250304
如何快速上手RabbitMQ 要快速上手 RabbitMQ,可以按照以下步骤进行,从安装到基本使用逐步掌握核心概念和操作: 1. 理解核心概念 Producer(生产者):发送消息的程序。Consumer(消费者)…...
PPT小黑第26套
对应大猫28 层次级别是错的,看着是十页,导入ppt之后四十多页 选中所有 红色蓝色黑色 文本选择标题:选择 -格式相似文本(检查有没有漏选 漏选的话 按住ctrl 点下一个) 要求新建幻灯片中不包含原素材中的任何格式&…...
甘特图开发代码(测试版)
场景:要实现的功能就是单行数据能左右拖动。 流程五个:ABCDE。(对应:Charter开发、概念和计划、初样开发、正样开发、验证) 1、A有开始时间,结束时间。B的开始时间必须是A的结束时间(相等或者…...
鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 目录 技术融合背景与价值鸿蒙分布式架构解析DeepSeek技术体系剖析核心整合架构设计智能调度系统实现…...
Docker Desktop常见问题记录
1.docker pull报错,无法连接https://registry-1.docker.io/v2/ 报错信息如下: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection(Client.Timeout exceeded …...
Qt 的 Lambda 捕获局部变量导致 UI 更新异常的分析与解决
1. 问题描述 在 Qt 开发中,我们通常会使用 QTimer 进行周期性 UI 更新。例如,下面的代码用于在检测游戏窗口时,在 UI 界面上显示动态变化的“正在检测游戏窗口...”的文本,每 300 毫秒更新一次。 void MainWindow::detectAndPopulateGameList() {ui->game_record_stac…...
RAGflow采用docker-compose-continuous方式pull,把服务器充满了
采用docker-compose-continuous在后台下载,导致服务器被充满。 原因分析: 如果网络不稳定,可能导致下载任务异常中断,而 systemd 服务会不断重启并重新下载,从而占用大量空间。如果网络问题无法解决,可以…...
【第12节】C++设计模式(结构型模式)-Proxy(代理)模式
一、问题背景 使用 Proxy 模式优化对象访问 在某些情况下,直接访问对象可能会导致性能问题或安全性问题。Proxy 模式(代理模式)通过引入一个代理对象来控制对原始对象的访问,从而解决这些问题。以下是几种典型的应用场景…...
【C++】vector(上):vector的常用接口介绍
文章目录 前言一、vector的介绍二、vector的常用接口介绍1.vector类对象的常见构造2.vector iterator 的使用3.vector类对象的容量操作3.1 size、capacity 和 empty的使用3.2 reserve的使用3.3 resize的使用 4.vector类对象的访问(包含data:返回底层数组…...
【详细讲解在STM32的UART通信中使用DMA机制】
详细讲解在STM32的UART通信中使用DMA机制 目录 详细讲解在STM32的UART通信中使用DMA机制一、DMA机制概述二、DMA在UART中的作用三、DMA的配置步骤四、UART初始化与DMA结合五、DMA传输的中断处理六、DMA与中断的结合使用七、注意事项与常见问题八、代码示例九、总结 一、DMA机制…...
极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【三】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
快速生成viso流程图图片形式
我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制,viso这个软件大部分技术人员都会使用,但是想要画的好看,画的科学还是比较难的,现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…...
设备管理系统功能与.NET+VUE(IVIEW)技术实现
在现代工业和商业环境中,设备管理系统(Equipment Management System,简称EMS)是确保设备高效运行和维护的关键工具。本文采用多租户设计的设备管理系统,基于.NET后端和VUE前端(使用IVIEW UI框架)…...
《深度学习实战》第11集:AI大模型压缩与加速
深度学习实战 | 第11集:AI大模型压缩与加速 在深度学习领域,随着模型规模的不断增大,模型的推理速度和部署效率成为实际应用中的关键挑战。本篇博客将带你深入了解模型压缩与加速的核心技术,并通过一个实战项目展示如何使用知识蒸…...
【大模型安全】大模型的技术风险
【大模型安全】大模型的技术风险 1.DDoS攻击2.常见的传统网络攻击方式3.恶意意图的识别4.AI生成虚假信息传播5.利用AI进行黑客攻击6.模型对抗攻击7.后门攻击8.Prompt攻击9.数据投毒攻击10.模型窃取攻击11.数据窃取攻击 1.DDoS攻击 2023年11月9日凌晨,OpenAI在官网公…...
git命令学习记录
1. git reset 参数说明 git reset 是用来回退版本的,它可以添加三个参数,常用的使用格式是这样的:git reset [--hard | --soft | --mixed] 版本号 一般使用git修改文件并提交需要三步,第一步在文本编辑器中编辑文件,也…...
Gartner:数据安全平台DSP提升数据流转及使用安全
2025 年 1 月 7 日,Gartner 发布“China Context:Market Guide for Data Security Platforms”(《数据安全平台市场指南——中国篇》,以下简称指南),报告主要聚焦中国数据安全平台(Data Securit…...
结构型模式---享元模式
概念 享元模式是一种结构型设计模式,他摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态:就…...
一学就会:A*算法详细介绍(Python)
📢本篇文章是博主人工智能学习以及算法研究时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在&am…...
【Elasticsearch】Elasticsearch 中使用 HDFS 存储快照
在 Elasticsearch 中使用 HDFS 存储快照的步骤如下: 1.安装 HDFS 插件 要使用 HDFS 存储 Elasticsearch 的索引快照,需要在 Elasticsearch 集群的所有节点上安装 HDFS 插件。 • 在线安装:适用于网络环境良好的场景,执行以下命…...
【每日十题系列】前端面试高频题目
以下是作为前端面试官常用的10道手撕代码题目,涵盖JavaScript核心、CSS、算法及框架原理,结合高频考点与实际开发场景设计: 1. 手写防抖(debounce)与节流(throttle) 要求:实现防抖函…...
Kafka 消息 0 丢失的最佳实践
文章目录 Kafka 消息 0 丢失的最佳实践生产者端的最佳实践使用带有回调的 producer.send(msg, callback) 方法设置 acks all设置 retries 为一个较大的值启用幂等性与事务(Kafka 0.11)正确关闭生产者与 flush() 方法 Broker 端的最佳实践设置 unclean.l…...
学网络安全报班可靠吗?
在当今社会,网络安全已经成为我们工作和生活中不可忽视的重要部分,而且市场上各大企业对网络安全人才的需求量非常之大,因此网络安全培训班应运而生,那么学网络安全报培训班靠谱吗?这是很多小伙伴都关心的问题,我们来…...
LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)
【LetMeFly】1745.分割回文串 IV:动态规划(用III或II能直接秒) 力扣题目链接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,…...
4 Redis4 List命令类型讲解
Redis 列表(List)命令详解 1. Redis 列表(List)简介 Redis 列表(List)是一个简单的字符串列表,按照插入顺序排序。它可以用作 栈(Stack) 和 队列(Queue&…...
鬼泣:项目前置设置杂项
能帮到你的话,就给个赞吧 😘 文章目录 插件niagara ui render:在 UI 中渲染 Niagara 特效skeletal editor:编辑骨骼,调整骨骼动画motion warping:根据目标自动调整角色动画。animation warping:…...
MyBatis-Plus 条件构造器的使用(左匹配查询)
在上一篇文章中,我们已经介绍了 MyBatis-Plus 条件构造器,包括 QueryWrapper 和 UpdateWrapper 的基本使用方法、常见查询条件(如等于、不等于、大于、小于)以及如何使用 Lambda 表达式来构建动态查询和更新条件。 在本文中&…...
#define GBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg))
这个宏 #define GBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) 是用来在 C++ 中标记某些函数、变量或者代码元素为已弃用(deprecated)的,并附带一个自定义的弃用消息。 具体解释: __declspec(deprecated(msg)): __declspec 是 Microsoft Visual C++ (MSVC) 的扩展…...
Vue输入框获取焦点
1. 元素未渲染完成 如果你在组件挂载或数据更新后立即调用 focus(),可能元素还未渲染到 DOM 中,导致 focus() 失效。 解决方法:确保在元素渲染完成后再调用 focus()。可以使用 nextTick 确保 DOM 更新完成。 2. ref 未正确绑定 确保 ref 正确…...
辛格迪客户案例 | 深圳善康医药科技GMP培训管理(TMS)项目
01 善康医药:创新药领域的探索者 深圳善康医药科技股份有限公司自2017年创立以来,便扎根于创新药研发领域,专注于成瘾治疗药物的研究、生产与销售。公司坐落于深圳,凭借自身独特的技术优势与研发实力,在行业内逐渐崭露…...
迷你世界脚本出生点接口:Spawnport
出生点接口:Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...
Android车机DIY开发之软件篇(二十)立创泰山派android编译
准备工作 sudo apt-get update sudo apt-get install git -y sudo apt install repo -ysudo apt-get install python2.7sudo apt-get install python3sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /u…...
MDM 如何彻底改变医疗设备的远程管理
在现代医疗行业迅速发展的格局中,医院和诊所越来越依赖诸如医疗平板和移动工作站等移动设备。这些设备在提高工作效率和提供卓越的患者护理方面发挥着关键作用。然而,随着它们的广泛使用,也带来了一系列挑战,例如在不同地点确保数…...
Libgdx游戏开发系列教程(6)——游戏暂停
目录 最初方案1 优化方案2 - 事件拦截器监听按键 优化方案3 - 暂停状态重绘 优化方案4 优化方案5 补充 - 监听android手机的返回键 暂停也是一个游戏的必要功能了,本文研究了Libgdx实现游戏暂停 例子以桌面端游戏实现讲解为主,至于移动端,可能之后会进行补充... 本文最…...
车载测试:智能座舱测试中多屏联动与语音交互的挑战
智能座舱作为汽车智能化发展的核心,集成了多屏联动和语音交互功能,为驾驶员和乘客提供更便捷的体验。然而,这些功能的测试面临诸多挑战,包括多屏同步性、噪声干扰和复杂场景的处理。本文将详细分析这些挑战,探讨测试方…...
【踩坑随笔】`npm list axios echarts`查看npm依赖包报错
npm list axios echarts查看npm依赖包出现以下报错,原因就是包的版本匹配问题,按照提示降axios版本或者自己升找合适的got版本,我这里是选择了降版本。本文记录仅做解决思路参考不一定适配大家的实际情况。 weed-detection-system1.0.0 E:\P…...
用于管理 Elasticsearch Serverless 项目的 AI Agent
作者:来自 Elastic Fram Souza 由自然语言驱动的 AI 代理,可轻松管理 Elasticsearch Serverless 项目 - 支持项目创建、删除和状态检查。 这个小型命令行工具让你可以用简单的英语管理你的无服务器 Elasticsearch 项目。它通过AI(这里是 Ope…...