第一百一十天学习记录:C++实战:自我设计用单链表、多态和文件操作写一个公会人员管理系统

本文主要是介绍第一百一十天学习记录:C++实战:自我设计用单链表、多态和文件操作写一个公会人员管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现程序界面展示:

主界面:

在这里插入图片描述

程序输入非正常字符情况保护

在这里插入图片描述
在这里插入图片描述

添加会员信息

在这里插入图片描述

删除会员信息

在这里插入图片描述

查找会员信息

在这里插入图片描述

变更会员会阶

在这里插入图片描述

显示所有会员

在这里插入图片描述

排序会员信息

在这里插入图片描述

查看种族职业

在这里插入图片描述

保存信息的txt文件

在这里插入图片描述

工程文件目录

在这里插入图片描述

main.cpp代码

#include "allmember.h"
#include "alljob.h"
#include "allrace.h"
#include "allrank.h"enum Job
{EXI,//退出ADD,//添加LIS,//显示DEL,//删除MOD,//编辑SER,//查找SOR,//排序CHE //团队
};const int Orcjob[6] = { 1,2,3,4,9,10 };
const int Trolljob[7] = { 1,2,3,4,5,8,10 };
const int Taurenjob[5] = { 1,2,3,6,10 };
const int Forsakenjob[6] = { 1,4,5,8,9,10 };
const int BloodElfjob[7] = { 2,4,5,7,8,9,10 };
const int Humanjob[7] = { 1,4,5,7,8,9,10 };
const int Dwarfjob[6] = { 1,2,4,7,8,10 };
const int Gnomejob[5] = { 1,4,5,9,10 };
const int NightElfjob[6] = { 1,2,4,6,8,10 };
const int Draeneijob[7] = { 1,2,3,5,7,8,10 };void showtable()
{cout << "*****************************************" << endl;cout << "**********公会职业信息管理系统***********" << endl;cout << "*****************************************" << endl;cout << "************1、 添加会员信息*************" << endl;cout << "************2、 显示所有会员*************" << endl;cout << "************3、 删除会员信息*************" << endl;cout << "************4、 变更会员会阶*************" << endl;cout << "************5、 查找会员信息*************" << endl;cout << "************6、 排序会员信息*************" << endl;cout << "************7、 查看种族职业*************" << endl;cout << "************0、 退出管理系统*************" << endl;cout << "*****************************************" << endl;cout << "***请输入您所需要的操作选项,按回车确认:" << endl;
}Allmember* newmember(int Id,string Name,int Sex,int woker,int race,int rank)
{Worker* tmpwoker = NULL;Race* tmprace = NULL;GuildRank* tmprank = NULL;switch (woker){case 1:tmpwoker = new Warrior;break;case 2:tmpwoker = new Hunter;break;case 3:tmpwoker = new Shaman;break;case 4:tmpwoker = new Rogue;break;case 5:tmpwoker = new Mage;break;case 6:tmpwoker = new Druid;break;case 7:tmpwoker = new Paladin;break;case 8:tmpwoker = new Priest;break;case 9:tmpwoker = new Warlock;break;case 10:tmpwoker = new DeathKnight;break;default:break;}switch (race){case 1:tmprace = new Orc;break;case 2:tmprace = new Troll;break;case 3:tmprace = new Tauren;break;case 4:tmprace = new Forsaken;break;case 5:tmprace = new BloodElf;break;case 6:tmprace = new Human;break;case 7:tmprace = new Dwarf;break;case 8:tmprace = new Gnome;break;case 9:tmprace = new NightElf;break;case 10:tmprace = new Draenei;break;default:break;}switch (rank){case 1:tmprank = new President;break;case 2:tmprank = new Official;break;case 3:tmprank = new Elite;break;case 4:tmprank = new Member;break;case 5:tmprank = new Intern;break;default:break;}string m_Sex;if (Sex == 1){m_Sex = "男";}else{m_Sex = "女";}Allmember* ptemp = new Allmember(Id, Name, m_Sex, tmpwoker, tmprace, tmprank);ptemp->p_next = NULL;return ptemp;
}void read_member(Allmember* phead)
{ifstream ifs;ifs.open(FILENAME, ios::in);if (!ifs.is_open()){ifs.close();return;}char ch;ifs >> ch;if (ifs.eof()){ifs.close();return;}ifs.seekg(0, ios::beg);//因为在前面判断数据库是否为空的时候ifs移动了一个字符,因此这里需要将ifs指向置为初始int Id;string Name;int Sex;int worker;int race;int rank;while (ifs >> Id&&ifs >> Name&&ifs >> Sex&&ifs >> worker&&ifs >> race&&ifs >> rank){Allmember* pnew = newmember(Id,Name,Sex,worker,race,rank);phead->p_next = pnew;phead = pnew;}ifs.close();
}Allmember* initList()
{int Id = 0;string Name = "";string Sex = "";Worker* worker = NULL;Race* race = NULL;GuildRank* rank = NULL;Allmember* member = new Allmember(1, Name, Sex, worker, race, rank);member->p_next = NULL;return member;
}void showallmember(Allmember* phead)
{while (phead->p_next){phead->p_next->showInfo();phead = phead->p_next;}
}void savemember(Allmember* phead)
{int Id;string Name;int Sex;int worker;int race;int rank;ofstream ofs;ofs.open(FILENAME, ios::out);while (phead->p_next){Id = phead->p_next->getId();Name = phead->p_next->getName();Sex = phead->p_next->getSex();worker = phead->p_next->getWorker();race = phead->p_next->getRace();rank = phead->p_next->getGuildRank();ofs << Id << " "<< Name << " "<< Sex << " "<< worker << " "<< race << " "<< rank << " " << endl;phead = phead->p_next;}ofs.close();
}bool checkId(int Id, Allmember* phead)
{while (phead->p_next){if (Id == phead->p_next->getId()){return false;}phead = phead->p_next;}return true;
}bool checkrank(Allmember* phead)
{while (phead->p_next){if (1 == phead->p_next->getGuildRank()){return false;}phead = phead->p_next;}return true;
}void addmember(Allmember* phead)
{int Id;string Name;int Sex;int worker;int race;int rank;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入新会员编号=>";cin >> Id;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (Id < 1 || Id > 9999){cout << "输入编号超出范围(1~9999),请重新输入。" << endl;continue;}bool isOk = checkId(Id, phead);if (isOk){break;}else{cout << "存在重复的编号,请重新输入。" << endl;continue;}}while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入新会员姓名=>";cin >> Name;if (cin.fail()) {cout << "输入内容错误,请重新输入!" << endl;cin.clear();continue;}break;}cout << "1、男  2、女" << endl;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入新会员性别=>";cin >> Sex;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (Sex < 1 || Sex > 2){cout << "输入性别选项超出范围(1~2),请重新输入。" << endl;continue;}break;}cout << "1、会长  2、官员  3、精英  4、会员  5、见习" << endl;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入新会员公会会阶=>";cin >> rank;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (rank < 1 || rank > 5){cout << "输入会阶选项超出范围(1~5),请重新输入。" << endl;continue;}if (rank == 1){bool isOk = checkrank(phead);if (isOk){break;}else{cout << "公会只允许一名会长,请重新输入。" << endl;continue;}}break;}cout << "1、兽人  2、巨魔  3、牛头人 4、被遗忘者  5、血精灵" << endl;cout << "6、人类  7、矮人  8、侏儒   9、暗夜精灵 10、德莱尼" << endl;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入新会员种族=>";cin >> race;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (race < 1 || race > 10){cout << "输入种族选项超出范围(1~10),请重新输入。" << endl;continue;}break;}switch (race){case 1:cout << "1、战士 2、猎人 3、萨满" << endl;cout << "4、潜行者 5、术士 6、死亡骑士" << endl;break;case 2:cout << "1、战士 2、猎人 3、萨满" << endl;cout << "4、潜行者 5、法师 6、牧师 7、死亡骑士" << endl;break;case 3:cout << "1、战士 2、猎人 3、萨满" << endl;cout << "4、德鲁伊 5、死亡骑士" << endl;break;case 4:cout << "1、战士 2、潜行者 3、法师" << endl;cout << "4、牧师 5、术士 6、死亡骑士" << endl;break;case 5:cout << "1、猎人 2、潜行者 3、法师" << endl;cout << "4、圣骑士 5、牧师 6、术士 7、死亡骑士" << endl;break;case 6:cout << "1、战士 2、潜行者 3、法师" << endl;cout << "4、圣骑士 5、牧师 6、术士 7、死亡骑士" << endl;break;case 7:cout << "1、战士 2、猎人 3、潜行者" << endl;cout << "4、圣骑士 5、牧师 6、死亡骑士" << endl;break;case 8:cout << "1、战士 2、潜行者 3、法师" << endl;cout << "4、术士 5、死亡骑士" << endl;break;case 9:cout << "1、战士 2、猎人 3、潜行者" << endl;cout << "4、德鲁伊 5、牧师 6、死亡骑士" << endl;break;case 10:cout << "1、战士 2、猎人 3、萨满" << endl;cout << "4、法师 5、圣骑士 6、牧师 7、死亡骑士" << endl;break;default:break;}while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入新会员职业=>";int chjob = 0;cin >> chjob;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}switch (race){case 1:if (chjob < 1 || chjob > 6){cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;continue;}worker = Orcjob[chjob - 1];break;case 2:if (chjob < 1 || chjob > 7){cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;continue;}worker = Trolljob[chjob - 1];break;case 3:if (chjob < 1 || chjob > 5){cout << "输入职业选项超出范围(1~5),请重新输入。" << endl;continue;}worker = Taurenjob[chjob - 1];break;case 4:if (chjob < 1 || chjob > 6){cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;continue;}worker = Forsakenjob[chjob - 1];break;case 5:if (chjob < 1 || chjob > 7){cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;continue;}worker = BloodElfjob[chjob - 1];break;case 6:if (chjob < 1 || chjob > 7){cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;continue;}worker = Humanjob[chjob - 1];break;case 7:if (chjob < 1 || chjob > 6){cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;continue;}worker = Dwarfjob[chjob - 1];break;case 8:if (chjob < 1 || chjob > 5){cout << "输入职业选项超出范围(1~5),请重新输入。" << endl;continue;}worker = Gnomejob[chjob - 1];break;case 9:if (chjob < 1 || chjob > 6){cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;continue;}worker = NightElfjob[chjob - 1];break;case 10:if (chjob < 1 || chjob > 7){cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;continue;}worker = Draeneijob[chjob - 1];break;default:break;}break;}Allmember* pnew = newmember(Id, Name, Sex, worker, race, rank);while (phead->p_next){phead = phead->p_next;}phead->p_next = pnew;cout << "成功添加一名新会员,新会员信息如下:" << endl;pnew->showInfo();
}void statistics(Allmember* phead)
{int total = 0;int sexarr[2] = { 0 };int rankarr[5] = { 0 };int racearr[10] = { 0 };int jobarr[10] = { 0 };while (phead->p_next){++total;if (1 == phead->p_next->getSex()){++sexarr[0];}else{++sexarr[1];}switch (phead->p_next->getGuildRank()){case 1:++rankarr[0];break;case 2:++rankarr[1];break;case 3:++rankarr[2];break;case 4:++rankarr[3];break;case 5:++rankarr[4];break;default:break;}switch (phead->p_next->getRace()){case 1:++racearr[0];break;case 2:++racearr[1];break;case 3:++racearr[2];break;case 4:++racearr[3];break;case 5:++racearr[4];break;case 6:++racearr[5];break;case 7:++racearr[6];break;case 8:++racearr[7];break;case 9:++racearr[8];break;case 10:++racearr[9];break;default:break;}switch (phead->p_next->getWorker()){case 1:++jobarr[0];break;case 2:++jobarr[1];break;case 3:++jobarr[2];break;case 4:++jobarr[3];break;case 5:++jobarr[4];break;case 6:++jobarr[5];break;case 7:++jobarr[6];break;case 8:++jobarr[7];break;case 9:++jobarr[8];break;case 10:++jobarr[9];break;default:break;}phead = phead->p_next;}cout << "***************公会统计信息***************" << endl;cout << "公会总人数:" << total << endl;cout << "公会男性会员:" << sexarr[0] << endl;cout << "公会女性会员:" << sexarr[1] << endl;cout << "------------------------------------------" << endl;cout << "公会会长人数:" << rankarr[0] << endl;cout << "公会官员人数:" << rankarr[1] << endl;cout << "公会精英人数:" << rankarr[2] << endl;cout << "公会会员人数:" << rankarr[3] << endl;cout << "公会见习人数:" << rankarr[4] << endl;cout << "------------------------------------------" << endl;cout << "公会  兽人  人数:" << racearr[0] << endl;cout << "公会  巨魔  人数:" << racearr[1] << endl;cout << "公会 牛头人 人数:" << racearr[2] << endl;cout << "公会被遗忘者人数:" << racearr[3] << endl;cout << "公会 血精灵 人数:" << racearr[4] << endl;cout << "公会  人类  人数:" << racearr[5] << endl;cout << "公会  矮人  人数:" << racearr[6] << endl;cout << "公会  侏儒  人数:" << racearr[7] << endl;cout << "公会暗夜精灵人数:" << racearr[8] << endl;cout << "公会 德莱尼 人数:" << racearr[9] << endl;cout << "------------------------------------------" << endl;cout << "公会  战士  人数:" << jobarr[0] << endl;cout << "公会  猎人  人数:" << jobarr[1] << endl;cout << "公会  萨满  人数:" << jobarr[2] << endl;cout << "公会 潜行者 人数:" << jobarr[3] << endl;cout << "公会  法师  人数:" << jobarr[4] << endl;cout << "公会 德鲁伊 人数:" << jobarr[5] << endl;cout << "公会 圣骑士 人数:" << jobarr[6] << endl;cout << "公会  牧师  人数:" << jobarr[7] << endl;cout << "公会  术士  人数:" << jobarr[8] << endl;cout << "公会死亡骑士人数:" << jobarr[9] << endl;cout << "***************公会统计信息***************" << endl;
}void search(Allmember* phead)
{int Id;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入需要查找的编号=>";cin >> Id;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}while (phead->p_next){if (phead->p_next->getId() == Id){phead->p_next->showInfo();return;}phead = phead->p_next;}break;}cout << "查无此人!" << endl;
}void deletemenber(Allmember* phead)
{cout << "注:输入0取消删除操作。" << endl;int Id;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入需要删除的编号=>";cin >> Id;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (0 == Id){cout << "已取消删除操作。" << endl;return;}while (phead->p_next){if (phead->p_next->getId() == Id){string Name = phead->p_next->getName();Allmember* deltemp;deltemp = phead->p_next;phead->p_next = phead->p_next->p_next;delete deltemp;cout << Name << "已退出公会!" << endl;return;}phead = phead->p_next;}break;}cout << "查无此人!" << endl;
}void modmenber(Allmember* phead)
{Allmember* truephead = phead;cout << "注:输入0取消删除操作。" << endl;int Id;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入需要变更职务的编号=>";cin >> Id;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (0 == Id){cout << "已取消变更操作。" << endl;return;}while (phead->p_next){if (phead->p_next->getId() == Id){int newrank;cout << "1、会长  2、官员  3、精英  4、会员  5、见习" << endl;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入新的公会会阶=>";cin >> newrank;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (0 == newrank){cout << "已取消变更操作。" << endl;return;}if (newrank < 1 || newrank > 5){cout << "输入会阶选项超出范围(1~5),请重新输入。" << endl;continue;}if (newrank == 1){bool isOk = checkrank(truephead);if (isOk){break;}else{cout << "公会只允许一名会长,请重新输入。" << endl;continue;}}break;}int oldrank = phead->p_next->getGuildRank();if (oldrank == newrank){cout << "新会阶与原会阶一样。" << endl;return;}int Sex = phead->p_next->getSex();int worker = phead->p_next->getWorker();int race = phead->p_next->getRace();string Name = phead->p_next->getName();Allmember* temp= phead->p_next->p_next;delete phead->p_next;phead->p_next = newmember(Id, Name, Sex, worker, race, newrank);phead->p_next->p_next = temp;if (oldrank > newrank){cout << Name << "已晋升" << endl;}else{cout << Name << "已降职" << endl;}return;}phead = phead->p_next;}break;}cout << "查无此人!" << endl;
}void sortmenber(Allmember* phead)
{Allmember* truephead = phead;cout << "1、按照编号升序排列。" << endl;cout << "2、按照编号降序排列。" << endl;cout << "注:输入0取消删除操作。" << endl;int sortmod;while (true){int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "请输入需要排序的模式=>";cin >> sortmod;if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (0 == sortmod){cout << "已取消变更操作。" << endl;return;}if (sortmod < 1 || sortmod > 2){cout << "输入选项超出范围(1~2),请重新输入。" << endl;continue;}break;}int total = 0;while (phead->p_next){++total;phead = phead->p_next;}if (total < 2){cout << "当前公会人数少于2人无法排序。" << endl;return;}phead = truephead;int* intarr = new int[total];Allmember** Allmemberarr = new Allmember* [total];int i = 0;while (phead->p_next){Allmemberarr[i] = phead->p_next;intarr[i] = phead->p_next->getId();++i;phead = phead->p_next;}int flag;for (int i = 0; i < total - 1; ++i){flag = 0;for (int j = 0; j < total - i - 1; ++j){if (sortmod == 1){if (intarr[j] > intarr[j + 1]){int tmp = intarr[j];intarr[j] = intarr[j + 1];intarr[j + 1] = tmp;Allmember* sorttemp = Allmemberarr[j];Allmemberarr[j] = Allmemberarr[j + 1];Allmemberarr[j + 1] = sorttemp;flag = 1;}}else{if (intarr[j] < intarr[j + 1]){int tmp = intarr[j];intarr[j] = intarr[j + 1];intarr[j + 1] = tmp;Allmember* sorttemp = Allmemberarr[j];Allmemberarr[j] = Allmemberarr[j + 1];Allmemberarr[j + 1] = sorttemp;flag = 1;}}}if (flag == 0){break;}}phead = truephead;for (int i = 0; i < total; ++i){phead->p_next = Allmemberarr[i];phead = phead->p_next;}phead->p_next = NULL;cout << "排序后结果:" << endl;showallmember(truephead);
}int main()
{showtable();Allmember* pHead = initList();Allmember* pQuit = NULL;read_member(pHead);int choice = 8;do {int availableChars = (int)cin.rdbuf()->in_avail();if (availableChars){cin.ignore(numeric_limits<streamsize>::max(), '\n');}cout << "主菜单选项=>" ;cin >> choice;system("cls");showtable();if (cin.fail()) {cout << "输入内容不是整数,请重新输入!" << endl;cin.clear();continue;}if (choice < 0 || choice> 7 ){cout << "输入数字超出范围,请重新输入。" << endl;continue;}switch (choice){case ADD:addmember(pHead);savemember(pHead);break;case LIS:showallmember(pHead);break;case DEL:deletemenber(pHead);savemember(pHead);break;case MOD:modmenber(pHead);savemember(pHead);break;case SER:search(pHead);break;case SOR:sortmenber(pHead);savemember(pHead);break;case CHE:statistics(pHead);break;default:break;}} while (choice);while (pHead){pQuit = pHead;pHead = pHead->p_next;delete pQuit;	}cout << "欢迎下次使用,再见。" << endl;return 0;
}

20230719修改:代码里有一处内存泄漏没有注意到。
在代码第974行(函数:void sortmenber(Allmember* phead)末尾)插入如下代码:

	showallmember(truephead);if (intarr != NULL){delete intarr;intarr = NULL;cout << "delete intarr" << endl;}if (Allmemberarr != NULL){delete Allmemberarr;Allmemberarr = NULL;cout << "delete Allmemberarr" << endl;}

这篇关于第一百一十天学习记录:C++实战:自我设计用单链表、多态和文件操作写一个公会人员管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420872

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio