当前位置: 首页 > news >正文

C++实现银行排队系统

网上看到的设计要求:

基本效果已经实现,希望大家帮忙指点指点。

程序中的一些基本模块

程序处理中的一些流程图

程序运行结果如下图:

程序代码如下:

#include <iostream>
#include <string>
#include <random>
#include <ctime>
#include <cassert>
#include <vector>
#include <queue>
#include <thread>
#include <atomic>
#include <chrono>
#include <sstream>
#include <iomanip>
#include <memory>
#include <mutex>#define DESTIME 100#define LOG(x)  std::cout << #x << std::endlint getRandomNum(int lnum, int rnum)
{// 设定随机数种子,使用当前时间std::random_device rd;std::mt19937 gen(rd());// 定义随机数分布范围,这里使用均匀分布std::uniform_int_distribution<> dis(lnum, rnum); // 例如,生成1到100之间的随机数// 生成随机数int random_number = dis(gen);return random_number;
}//HHMM时间添加int时间,返回HHMM格式时间
std::string addMinutesToTime(const std::string& timeStr, int minutesToAdd) {int hours, minutes;char delimiter;//解析输入时间std::istringstream iss(timeStr);if (!(iss >> std::setw(2) >> hours >> delimiter >> std::setw(2) >> minutes) || delimiter != '-'){throw std::invalid_argument("错误的时间格式,请输入HH-MM格式");}//将时间间隔加到分钟上minutes += minutesToAdd;hours += minutes / 60;hours %= 24;		//24小时取余minutes %= 60;	    //60分钟取余//格式化输出时间std::ostringstream oss;oss << std::setw(2) << std::setfill('0') << hours << "-"<< std::setw(2) << std::setfill('0') << minutes;return oss.str();
}//HHMM 格式时间数据转换为int类型数据
int numToHHMMtime(const std::string strTime)
{int timeNum = 0;char delimiter;int hours, minutes;std::istringstream iss(strTime);if (!(iss >> std::setw(2) >> hours >> delimiter >> std::setw(2) >> minutes) || delimiter != '-' || hours >= 24 || hours < 0 || minutes < 0 || minutes >= 60){throw std::invalid_argument("错误的时间,请输入正确的HH-MM格式数据");}minutes += (hours * 60);return minutes;
}//客户类
class Customer {
public://设置VIPvoid setVIP(bool vip);//设置进入时间void setEnterTime(const std::string time);//设置离开时间void setLeftTime(const std::string time);//设置排队号码void setQueueNumber(unsigned int num);//生成评分(传入满分,随机生成区间内分数)int getScore(int score);//判断是否是VIPbool isVIP() {return VIP;}//获取进入时间std::string getEnterTime() {return enterTime;}//获取离开时间std::string getLeftTime() {return leftTime;}//获取排队号码unsigned int getQueueNumber() {return queueNumber;}private:bool VIP = false;					//VIP标志std::string enterTime = " ";		//进入时间std::string leftTime = " ";			//离开时间unsigned int queueNumber = 0;		//排队号码
};//评分类
class Rating {
public://设置分数void setScore(int _num);//设置评分时间void setRatingTime(const std::string time);//获取分数int getScore() {return score;}//获取评分时间std::string getRatingTime() {return ratingTime;}private:std::string ratingTime = " ";		//评分时间int score = 0;				    //评分分数
};//窗口类
class CounterWindow {
public:CounterWindow(int num) :windowNum(num) {};void setVIP() {VIPflag = true;}//添加客户void addCustomer(Customer& customer);//移除客户(这里不考虑客户不排队了的情况)void removeCustomer() {//先移除VIP还是先移除普通用户。查询当前正在服务的VIP标志if (VipWorkFlag){vipCustomerQue.pop();}else {customerQue.pop();}}//添加打分void addGrade();//办理业务void conductBusiness();//VIP队列人数int getVipCustomQuenNum(){return vipCustomerQue.size();}//客户队列人数int getCustomeQuenNum(){return customerQue.size();}//设置处理业务耗时void setWorkTime(int workTime){windowTime = workTime;			    //设置窗口时间和工作时间相同}//停止业务处理void closeConduct() {					//关闭业务closeFlag = true;}//开始业务处理void openConduct() {					//开启业务closeFlag = false;}private://生成业务办理耗时void businessProcessTime();private:bool VIPflag = false;					//VIP窗口标志bool VipWorkFlag = false;				//VIP正在工作标识符bool closeFlag = false;					//停止营业标志int windowNum;							//窗口号std::queue<Customer> customerQue;		//客户队列std::queue<Customer> vipCustomerQue;	//VIP客户队列std::vector<Rating> ratingVec;			//分数容器int windowTime = 0;						//窗口时间
};class sysTime {
public:sysTime(const sysTime&) = delete;sysTime& operator = (const sysTime&) = delete;// 获取类的唯一实例static sysTime& getInstance() {static std::mutex mtx; // 用于线程安全的互斥锁std::lock_guard<std::mutex> lock(mtx); // 自动管理锁的获取和释放static sysTime instance; // 局部静态变量,线程安全地在第一次调用时初始化return instance;}//获取字符串格式时间std::string get_HHMM_time();//获取时间int getTime() {return timeNum;}private:sysTime() : workThread(&sysTime::timeLoop, this) {//检查是否启动成功if (!workThread.joinable()) {std::cerr << "线程启动失败" << std::endl;}std::cout << "时间线启动成功" << std::endl;}~sysTime() {end();if (workThread.joinable()) {workThread.join();}}void start() {timeflag.store(false);}void end() {timeflag.store(true);}//循环计时void timeLoop();private:std::atomic<bool> timeflag;std::thread workThread;				//时间计数工作线程int timeNum = 0;					//时间计数器
};//银行类
class Bank {
public://设置营业开始时间void setOpenTime(std::string time);//设置营业结束时间void setCloseTime(std::string time);//设置窗口数量void setNumWindow(int num);//进入客户void enterCustomer(Customer& customer);//打开所有线程void openAllThread();//等待关闭所有线程void joinAllThreads();private:CounterWindow* getShortWindow(bool isVIP);private:int businessOpenTime;							//营业开始时间int businessCloseTime; 							//营业结束时间std::vector<CounterWindow> counterWinVec;		//窗口维护容器std::vector<CounterWindow> counterWinVipVec;	//VIP窗口维护器bool openFlag = false;							//营业标志std::vector<std::shared_ptr<std::thread>> threads;		//线程组};class Menu {
public:void start();private:};int main()
{Menu menu;menu.start();return 0;
}void Customer::setVIP(bool vip)
{this->VIP = vip;
}void Customer::setEnterTime(const std::string time)
{this->enterTime = time;
}void Customer::setLeftTime(const std::string time)
{this->leftTime = time;
}void Customer::setQueueNumber(unsigned int num)
{this->queueNumber = num;
}int Customer::getScore(int score)
{//使用断言判断输入分数是否在区间内assert(score >= 1);// 设定随机数种子,使用当前时间std::random_device rd;std::mt19937 gen(rd());// 定义随机数分布范围,这里使用均匀分布std::uniform_int_distribution<> dis(1, score); // 例如,生成1到100之间的随机数// 生成随机数int random_number = dis(gen);return random_number;
}void Rating::setScore(int _num)
{this->score = _num;
}void Rating::setRatingTime(const std::string time)
{this->ratingTime = time;
}//添加客户
void CounterWindow::addCustomer(Customer& customer) {if (customer.isVIP()){vipCustomerQue.push(customer);}else {customerQue.push(customer);}
}void CounterWindow::addGrade()
{Rating rate;Customer customer;int scoreNum;		//分数if (VipWorkFlag){customer = vipCustomerQue.front();}else {customer = customerQue.front();}scoreNum = customer.getScore(10);			//10分满分进行评分rate.setScore(scoreNum);rate.setRatingTime(addMinutesToTime(sysTime::getInstance().get_HHMM_time(), windowTime));ratingVec.push_back(rate);int personNum = customerQue.size() + vipCustomerQue.size();std::cout << "评分是" << rate.getScore() << " 评分时间是" << rate.getRatingTime()  << " 窗口是" << windowNum << "排队人数是" << personNum <<std::endl;}void CounterWindow::conductBusiness()
{while (!closeFlag){int vipSize = vipCustomerQue.size();if (vipSize > 0) {						//判断当前窗口是否有VIP客户正在排队VipWorkFlag = true;				    //标志给VIP客户办理业务}else if (customerQue.size() > 0) {VipWorkFlag = false;}else {//两种条件都不满足,程序跳出continue;}//办理业务,这里使用线程睡眠一段时间模拟businessProcessTime();//客户评分,生成客户评分addGrade();//移除客户,移除队列里的客户removeCustomer();}
}void CounterWindow::businessProcessTime()
{int num = getRandomNum(5, 20);windowTime = num;setWorkTime(num);num = num * DESTIME;std::chrono::milliseconds desTime(num);std::this_thread::sleep_for(desTime);}//获取字符串格式时间
std::string sysTime::get_HHMM_time()
{int hours, minutes;//输入时间余多少分钟minutes = timeNum % 60;//输入时间换算为多少小时hours = timeNum / 60;hours %= 24;std::ostringstream oss;oss << std::setw(2) << std::setfill('0') << hours << "-"<< std::setw(2) << std::setfill('0') << minutes;return oss.str();
}void sysTime::timeLoop()
{start();while (!timeflag.load()){//使用chrono库定义时间间隔,这里使用100ms对应1sstd::chrono::milliseconds desTime(DESTIME);std::this_thread::sleep_for(desTime);timeNum++;}
}void Menu::start()
{// 使用单例sysTime& myTime = sysTime::getInstance();Bank bank;bank.setOpenTime("09-00");bank.setCloseTime("17-00");bank.setNumWindow(4);while (1){int num = getRandomNum(1, 10);		//1分钟到60分钟内进入一位顾客num = num * DESTIME;				//得到转换后的毫秒数std::chrono::milliseconds sleepTime(num);std::this_thread::sleep_for(sleepTime);if (myTime.getTime() >= 1440) {		//一天时间为1440分钟break;}Customer customer;bank.enterCustomer(customer);std::string strTime = myTime.get_HHMM_time();}bank.joinAllThreads();}void Bank::setOpenTime(std::string time)
{businessOpenTime = numToHHMMtime(time);
}void Bank::setCloseTime(std::string time)
{businessCloseTime = numToHHMMtime(time);
}void Bank::setNumWindow(int num)
{assert(num >= 2);//设置一个VIPCounterWindow cWindow(-1);cWindow.setVIP();counterWinVipVec.push_back(cWindow);for (int i = 0; i < num - 1; i++){CounterWindow window(i);counterWinVec.push_back(window);}
}void Bank::enterCustomer(Customer& customer)
{int nowTime = sysTime::getInstance().getTime();if (nowTime < businessOpenTime || nowTime > businessCloseTime){std::cout << "当前不在营业时间当前时间是" << sysTime::getInstance().get_HHMM_time() << std::endl;openFlag = false;if (openFlag)				//如果之前是营业的,关闭窗口营业线程,这就导致程序启动模拟要从营业前的时间段开始{openFlag = false;//关闭窗口线程joinAllThreads();		//等待所有的线程关闭}return;}else {if (!openFlag)				//如果之前是不在营业的,开启窗口营业线程{openFlag = true;//开启窗口线程openAllThread();		//开启所有的线程}}Customer customers;customers.setEnterTime(sysTime::getInstance().get_HHMM_time());//查找排队最短窗口CounterWindow* win = getShortWindow(customers.isVIP());win->addCustomer(customers);		//添加客户到排队窗口}void Bank::joinAllThreads()
{//关闭普通窗口for (auto it : counterWinVec){it.closeConduct();}//关闭VIP窗口for (auto it : counterWinVipVec){it.closeConduct();}for (auto& threadPtr : threads){if (threadPtr->joinable()){threadPtr->join();}}
}CounterWindow* Bank::getShortWindow(bool isVIP)
{CounterWindow* win, * vipWin;		//普通窗口和vip窗口if (!isVIP)			//不是VIP分支{//获取第一个队列的长度,然后以这个长度为基准int num = counterWinVec[0].getCustomeQuenNum();int counter = 0;for (int i = 0; i < counterWinVec.size(); i++){int tempNum = counterWinVec[i].getCustomeQuenNum();if (tempNum <= num){num = tempNum;counter = i;}}win = &counterWinVec[counter];return win;}else {				//是VIP分支int vipNum = counterWinVipVec[0].getVipCustomQuenNum();int vipCount = 0;for (int i = 0; i < counterWinVipVec.size(); i++){int tempNum = counterWinVipVec[i].getVipCustomQuenNum();if (tempNum <= vipNum){vipNum = tempNum;vipCount = i;}}vipWin = &counterWinVipVec[vipCount];			//获取VIP下标//获取第一个队列的长度,然后以这个长度为基准int num = counterWinVec[0].getCustomeQuenNum();int counter = 0;for (int i = 0; i < counterWinVec.size(); i++){int tempNum = counterWinVec[i].getVipCustomQuenNum();if (tempNum < num){num = tempNum;counter = i;}}win = &counterWinVec[counter];if (win->getVipCustomQuenNum() >= vipWin->getVipCustomQuenNum()){return vipWin;}else {return win;}}
}void Bank::openAllThread()
{//启动VIP窗口for (int i = 0; i < counterWinVipVec.size(); i++){auto threadPtr = std::make_shared<std::thread>([this, i]() {counterWinVipVec[i].openConduct();counterWinVipVec[i].conductBusiness();		//启动线程开启业务});threads.push_back(threadPtr);}//启动窗口for (int i = 0; i < counterWinVec.size(); i++){auto threadPtr = std::make_shared<std::thread>([this, i]() {counterWinVec[i].openConduct();counterWinVec[i].conductBusiness();			//启动线程业务});threads.push_back(threadPtr);}
}

        时间系统使用while循环实现的,sysTime类使用了懒汉单例模式,在菜单类调用中初始化。
有一些多线程之类的,智能指针、原子变量、没有上锁,因为没有库里面的读写锁,这里考虑到都是读取时间不会改变时间,就没有加锁。这里通过区间内获取随机数的方式取得一个时间间隔,模模拟顾客进入银行办理业务,Menu类中的start()函数中可以设置客流量的频率。
        练手的代码,有些地方没有处理好,比如程序一开始的时间转换函数,可以使用饿汉单例模式实现,(工具类不会占用很大资源吧)。总之,希望评论区多多指点。感谢(抱拳)。

相关文章:

C++实现银行排队系统

网上看到的设计要求&#xff1a; 基本效果已经实现&#xff0c;希望大家帮忙指点指点。 程序中的一些基本模块 程序处理中的一些流程图 程序运行结果如下图&#xff1a; 程序代码如下&#xff1a; #include <iostream> #include <string> #include <random&g…...

UI自动化测试保姆级教程①

欢迎来到阿妮莫的学习小屋慢也好&#xff0c;步子小也好&#xff0c;在往前走就好 目录 自动化测试 简介 作用 分类 优缺点 优点 缺点(误区) UI自动化测试 自动化测试使用场景 自动化测试实现时间 Selenium框架 特点 Web自动化测试环境部署 Selenium包安装 浏览…...

多行输入模式(dquote> 提示符)double quote(双引号)

文章目录 1、引号不匹配具体原因解决办法如何避免此问题 2、double quote&#xff08;双引号&#xff09;出现原因解决办法预防措施 ~/Downloads/productqualification-develop git:[main] git commit -m "漏添加到暂存区的代码“ dgqdgqdeMac-mini productqualification-…...

【Uniapp-Vue3】原生事件监听及组件内置事件处理

如果我们想给元素添加一个事件就要使用到v-on&#xff0c;也可以简写为&#xff1a; <标签名 v-on:事件名"函数"></标签名> 或简写为 <标签名 事件名"函数"></标签名> 比如我们想要实现点击一下元素&#xff0c;num就1&#xff0c…...

微软 2024 最新技术全景洞察

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

PHP语言的并发编程

PHP语言的并发编程 引言 随着互联网技术的迅速发展&#xff0c;Web 应用的复杂性和用户并发请求的增加&#xff0c;要求开发者在构建高性能应用时考虑并发编程。并发编程允许程序在同一时间执行多个任务&#xff0c;这对于处理高流量网站、API 和实时应用程序至关重要。虽然 …...

Nginx 解析漏洞复现

漏洞原理 该漏洞与Nginx、php版本无关&#xff0c;属于用户配置不当造成的解析漏洞。主要是由于下面两个配置的错误&#xff1a; cgi.fix_pathinfo1&#xff0c;该配置项的作用是如果访问的.php文件不存在&#xff0c;则采用上层路径&#xff0c;例如访问/test.png/.php,一般…...

使用XAML语言仿写BiliBil登录界面

实现步骤 实现左右布局 使用了Grid两列的网格布局&#xff0c;第一列宽度占35%&#xff0c;第二列宽度占65%。使用容器布局Border包裹左右布局内容&#xff0c;设置背景色、设置圆角 <!-- 定义两列--> <Grid.ColumnDefinitions><ColumnDefinition Width &quo…...

Kubernetes Gateway API-4-TCPRoute和GRPCRoute

1 TCPRoute 目前 TCP routing 还处于实验阶段。 Gateway API 被设计为与多个协议一起工作&#xff0c;TCPRoute 就是这样一个允许管理TCP流量的路由。 在这个例子中&#xff0c;我们有一个 Gateway 资源和两个 TCPRoute 资源&#xff0c;它们按照以下规则分配流量&#xff1…...

【C++动态规划 前缀和】3250. 单调数组对的数目 I|1897

本文涉及知识点 C动态规划 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode3250. 单调数组对的数目 I 给你一个长度为 n 的 正 整数数组 nums 。 如果两个 非负 整数数组 (arr1, arr2) 满足以下条件&#xff0c;我们称它们是 单调…...

【机器学习:五、使梯度下降法更快收敛的技巧】

1. 特征缩放 1.1 特征缩放的作用 特征缩放是一种将不同特征值归一化到相似范围的技术&#xff0c;可以显著提高梯度下降法的收敛速度。 作用&#xff1a; 避免数值差异导致的优化困难&#xff1a;当特征值范围差异较大时&#xff0c;代价函数呈现“长而窄”的形状&#xff0…...

系统思考—结构影响行为

托尔斯泰在《安娜卡列尼娜》中说&#xff1a;“幸福的家庭都是相似的&#xff0c;不幸的家庭各有各的不幸。”在企业经营管理中也如此——企业剧本总是相似&#xff0c;只是男女主角不同。 但无论外在表现如何变化&#xff0c;真正决定企业命运的&#xff0c;是系统结构。 企业…...

WorldQuant Settings 配置项名词解释

中文翻译及通俗解释 语言(Language) 解释:BRAIN 平台支持使用快速表达式(Fast Expression)语言。 例子:快速表达式就像写公式,比如 price + volume,简单易懂且高效。更多内容可以参考“可用操作符”。 工具类型(Instrument type) 解释:目前只能使用“股票”作为工…...

mybatisPlus动态sql语句 ${ew.sqlSegment}

mybatis-plus的${ew.sqlSegment}&#xff0c;${ew.sqlSelect}&#xff0c;${ew.customSqlSegment} ew是mapper方法里的Param(Constants.WRAPPER) Wrapper queryWrapper对象 简答介绍&#xff1a; ${ew.sqlSelect}&#xff1a;拼接select SQL主体 Select("select ${ew.…...

ATGM336H-5N71支持多种卫星导航系统的定位模块

ATGM336H-5N7 1是 9.7X10.1尺寸&#xff0c;AT6558芯片&#xff0c;导航模块&#xff0c;GPSBDSGLONASS定位&#xff0c;16.369M晶振&#xff0c;标准输出 &#xff0c;电源2.7V~3.6V, 支持 UART0和UART1接口 . ATGM336H-5N特性&#xff1a; Flash TCXO 天线检测 天线过流保护 …...

Maven中管理SNAPSHOT版本含义及作用

在开发过程中突然产生了一个疑问&#xff1a;IDEA中 maven deploy的依赖包的版本号,比如 1.0.0-SNAPSHOT是在哪配置的&#xff1f;在远程仓库中的版本和这个有关系吗 &#xff1f; 在 Maven 中&#xff0c;-SNAPSHOT 后缀是用于标识项目版本为快照&#xff08;Snapshot&#xf…...

从技术到艺术:探索大模型提示词工程,给您的AI作品去去味

1. 增加互动性元素 请在文章中增加互动性元素&#xff0c;如提问、调查或互动链接&#xff0c;鼓励读者参与和反馈&#xff0c;提高文章的互动性和读者的参与度。 2. 加强视觉元素的应用 请在文章中适当加入图表、图片和其他视觉元素&#xff0c;增强文章的视觉效果&#xff0…...

OSPF - 1类LSA(Router-LSA)

点击返回LSA对照表 1类LSA是OSPF计算最原始的材料&#xff0c;他会泛洪发给所有的路由器 LSA是包含在LSU中的&#xff0c;一条LSU能够携带多条LSA options位所有LSA都会有&#xff0c;用于标记起源于什么类型的区域&#xff0c;具体查看文章【邻居建立】 flags位是一类LSA特…...

HTTP 协议中,GET、PUT、POST、DELETE、OPTIONS 和 PATCH 区别

在 HTTP 协议中&#xff0c;GET、PUT、POST、DELETE、OPTIONS 和 PATCH 是常见的请求方法&#xff08;HTTP Methods&#xff09;&#xff0c;用于定义客户端与服务器之间的交互方式。每种方法都有特定的语义和用途。以下是它们的详细解释&#xff1a; 1. GET 用途: 用于从服务…...

黄仁勋演讲总结(2种显卡,1个开源大模型,1个数据采集平台)

研发算力显卡RTX50系列&#xff0c;PC端显卡GB10&#xff0c;开源大模型Cosmos&#xff08;用于机器人和自动驾驶&#xff09;&#xff0c; Isaac GR00T&#xff08;人形机器人的数据采集平台&#xff09;。 新一代 RTX 50 系列显卡 RTX 50 系列 GPU&#xff0c;相对之前系列&a…...

支持向量机算法(一):像讲故事一样讲明白它的原理及实现奥秘

1、支持向量机算法介绍 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种基于统计学习理论的模式识别方法&#xff0c; 属于有监督学习模型&#xff0c;主要用于解决数据分类问题。SVM将每个样本数据表示为空间中的点&#xff0c;使不同类别的…...

掌握RabbitMQ:全面知识点汇总与实践指南

前言 RabbitMQ 是基于 AMQP 高级消息队列协议的消息队列技术。 特点&#xff1a;它通过发布/订阅模型&#xff0c;实现了服务间的高度解耦。因为消费者不需要确保提供者的存在。 作用&#xff1a;服务间异步通信&#xff1b;顺序消费&#xff1b;定时任务&#xff1b;请求削…...

Ansys Discovery 优化模式:掌握网格划分方法

本篇博客文章介绍了 Ansys Discovery 中高级 CFD 仿真的 Refine 模式下可用的网格划分方法。上一篇文章讨论了 Explore 模式中可用的网格划分技术。 Refine 模式下的高级网格划分技术 使用 Ansys Discovery 时&#xff0c;Refine 模式提供的网格划分技术比 Explore 模式多。这…...

CentOS: RPM安装、YUM安装、编译安装(详细解释+实例分析!!!)

目录 1.什么是RPM 1.1 RPM软件包命名格式 1.2RPM功能 1.3查询已安装的软件&#xff1a;rpm -q 查询已安装软件的信息 1.4 挂载&#xff1a;使用硬件&#xff08;光驱 硬盘 u盘等&#xff09;的方法&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 1…...

(转)rabbitmq怎么保证消息不丢失?

RabbitMQ 可以通过以下多种机制来保证消息不丢失&#xff1a; 生产阶段 - 持久化队列和交换器&#xff1a; - 在声明队列和交换器时&#xff0c;将 durable 参数设置为 true &#xff0c;确保它们是持久化的。这样&#xff0c;即使 RabbitMQ 节点重新启动&#xff0c;队列和交…...

List ---- 模拟实现LIST功能的发现

目录 listlist概念 list 中的迭代器list迭代器知识const迭代器写法list访问自定义类型 附录代码 list list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素…...

电力场景输电线覆冰分割数据集labelme格式1227张2类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1227 标注数量(json文件个数)&#xff1a;1227 标注类别数&#xff1a;2 标注类别名称:["ice","powerline"] 每个…...

springboot 日志实现

日志 日志框架可以分为 日志门面&#xff08;Facade&#xff09; 和 日志实现&#xff08;Implementation&#xff09;&#xff0c;Spring Boot 使用了 SLF4J 作为日志门面&#xff0c;Logback 或 Log4j2 作为日志实现。 日志门面以及日志实现 日志门面 日志门面&#xff0…...

Ubuntu Server安装谷歌浏览器

背景 服务器上跑爬虫服务器需要安装谷歌浏览器 安装 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb### sudo apt install ./google-chrome-stable_current_amd64.deb...

毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

计算机网路HTTP、TCP详解

HTTP HTTP基本概念 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;HTTP是在计算机世界中两点之间传输文字、图片、视频等超文本内容数据的约束与规范。 常见状态码&#xff1a; 2xx&#xff1a;报文被收到&#xff0c;已经在正确处理中。 3xx&#xff1a;重定向…...

小程序未来趋势预测:技术革新与市场前景

一、引言 在数字化转型加速的时代&#xff0c;小程序作为一种轻量级、无需下载安装的应用形式&#xff0c;凭借其快速开发、易于使用的特点&#xff0c;迅速崛起并成为企业和开发者拓展业务的重要工具。随着移动互联网的进一步普及和用户对便捷应用体验的需求增长&#xff0c;…...

JavaEE初阶——计算机工作原理

一、什么是JavaEE JavaEE&#xff08;Java Platform&#xff0c;Enterprise Edition&#xff09;是sun公司&#xff08;2009年4月20日甲骨文将其收购&#xff09;推出的企业级应用程序版本。这个版本以前称为 J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的服务器…...

Web前端ui框架

文章目录 Element简介 Ant Design vue简介关键特点&#xff1a; iview简介 Element 官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/installation添加链接描述 简介 Elementui 一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 Ant Design …...

炸弹 (boom.c)

炸弹 (boom.c) 时间限制: 800ms 内存限制: 256000KiB 进度: 57/12406 0.5% 题目描述 出题助教: Sakiyary 验题助教: Corax、XiEn、ErinwithBMQ、runz、MacGuffin、Bob 维多利亚的腐烂荒野上出现了 N 个魔物&#xff0c;你和小维需要抓紧时间调配炸弹对付它们。 荒野可以视…...

【C语言】可移植性陷阱与缺陷(八): 随机数的大小

在C语言编程中&#xff0c;随机数的生成和使用是一个常见的需求。然而&#xff0c;由于不同平台上的C标准库实现可能存在差异&#xff0c;随机数的生成和使用也可能面临可移植性问题。本文将深入探讨C语言中随机数的大小与可移植性相关的陷阱与缺陷&#xff0c;并提供相应的解决…...

SSL VPN

SSL VPN 是什么&#xff1f; 是采用SSL/TLS协议来实现远程接入的一种轻量级 VPN 技术。利用 SSL 协议提供的基于证书的身份认证、数据加密和消息完整性验证机制&#xff0c;可以为应用层之间的通信建立安全连接。因为 SSL 协议内置于浏览器中&#xff0c;使用 SSL VPN 可以免于…...

C语言:函数

目录 1.函数的解释 2.C语言函数的分类 2.1库函数 2.2自定义函数 2.2.1自定义函数的语法格式 2.2.2自定义函数的实践 (1)第一题&#xff1a;欢迎光临 (2)第二题 打印数字的平方 ​编辑 (3)第三题 计算和 3.函数的参数 3.1值传递的表现 --- 形参 3.2地址传递的表现 -…...

Vue 环境配置与项目创建指南

1. 前置要求 在开始配置 Vue 开发环境之前&#xff0c;需要确保以下工具已安装&#xff1a; Node.js&#xff1a;Vue 的构建工具依赖 Node.js。 npm 或 yarn&#xff1a;Node.js 自带 npm 包管理工具&#xff0c;也可以选择安装 yarn。 安装 Node.js 前往 Node.js 官网 下…...

关于物联网的基础知识(三)——物联网技术架构:连接万物的智慧之道!连接未来的万物之网!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;三&a…...

iOS - Tagged Pointer

1. 基本结构 // Tagged Pointer 的内存布局 union TaggedPointer {uintptr_t bits; // 完整的指针值struct {uintptr_t data : 60; // 数据部分uintptr_t tag : 4; // 类型标记};// 扩展类型struct {uintptr_t extData : 52; // 扩展数据uintptr_t extTag : …...

基于SpringBoot的音乐网站与分享平台

基于SpringBoot的音乐网站与分享平台 摘要1. 研究背景2.研究内容3.系统功能 3.1前台首页功能模块3.2在线听歌功能模块3.3后台登录功能模块3.4在线听歌管理模块 4.部分功能代码实现5.源码分享(免费获取) 需要源码联系我即可(免费获取)~ ??大家点赞、收藏、关注、评论啦 、查…...

【机器学习篇】 科技异次元的超强 “魔杖”,开启奇幻新程

一起开启这场旅行吧&#xff0c;关注博主&#xff0c;点赞支持不迷路&#xff0c;下面一同欣赏本篇的美妙吧&#xff01;&#xff01; &#xff01; 博主主页&#xff1a; 羑悻的小杀马特.-CSDN博客 在当今科技飞速发展的时代&#xff0c;机器学习宛如一把来自科技异次元的超强…...

opencv CV_TM_SQDIFF未定义标识符

opencv CV_TM_SQDIFF未定义标识符 opencv4部分命名发生变换&#xff0c;将CV_WINDOW_AUTOSIZE改为WINDOW_AUTOSIZE&#xff1b;CV_TM_SQDIFF_NORMED改为TM_SQDIFF_NORMED。...

OneFlow的简单介绍

OneFlow 是北京一流科技有限公司旗下的采用全新架构设计的开源工业级通用深度学习框架。以下是关于 OneFlow 的详细介绍&#xff1a; 本篇文章的目录 特点 功能 应用场景 发展历程 特点 简洁易用的接口&#xff1a;为深度学习相关的算法工程师提供一套简洁易用的用户接口…...

如何配置【Docker镜像】加速器+【Docker镜像】的使用

一、配置Docker镜像加速器 1. 安装/升级容器引擎客户端​ 推荐安装1.11.2以上版本的容器引擎客户端 2. 配置镜像加速器​ 针对容器引擎客户端版本大于1.11.2的用户 以root用户登录容器引擎所在的虚拟机 修改 "/etc/docker/daemon.json" 文件&#xff08;如果没有…...

《OpenCV》——模版匹配

文章目录 什么是模版匹配&#xff1f;函数介绍实例 什么是模版匹配&#xff1f; 模板匹配是在一幅图像中寻找与另一幅模板图像最匹配部分的技术。OpenCV 提供了多种模板匹配的方法&#xff0c;它在目标检测、物体识别等众多计算机视觉任务中有广泛的应用。例如&#xff0c;你有…...

【网络安全技术与应用】(选修)实验3 网络侦察

一、实验目的 培养学生综合运用搜索引擎、Whois数据库等手段对目标站点进行侦查的能力,了解站点查询常用的信息源及搜索工具,熟练掌握常见搜索工具的功能及使用技巧。培养学生使用搜索引擎在互联网查找特定设备的能力,熟悉联网设备搜索引擎的功能,熟练掌握设备搜索引擎的使…...

基于XGBoost的集成学习算法

目录 一、XGBoost原理1.1 提升方法&#xff08;Boosting&#xff09;1.2 提升决策树 &#xff08;BDT&#xff09;1.3 梯度提升决策树 &#xff08;GBDT&#xff09;1.4 极限梯度提升&#xff08;XGBoost&#xff09;1.4.1 XGBoost改进1.4.2 XGBoostcsklearn实现1.4.3 XGBoost回…...

【84键矮轴无线键盘】个人使用经历

推荐&#xff1a; 前行者MK84键&#xff08;理由&#xff1a;价格实惠&#xff0c;键位布局好&#xff0c;其他都是可接受程度&#xff09;K3 max&#xff08;理由&#xff1a;除了短命的续航、脚垫容易脱落&#xff0c;已无明显短板&#xff09; 我需要一把在小巧、舒适的主力…...