C++新特性||线程协程(代码解析1)
原文https://blog.csdn.net/ke_wu/article/details/144807820?sharetype=blogdetail&sharerId=144807820&sharerefer=PC&sharesource=ke_wu&spm=1011.2480.3001.8118
#ifndef ZERO_THREADPOOL_H
#define ZERO_THREADPOOL_H#include <future> // 用于future相关操作
#include <functional> // 用于std::bind和function
#include <iostream> // 用于输入输出
#include <queue> // 用于任务队列
#include <mutex> // 用于锁
#include <memory> // 用于智能指针
#ifdef WIN32
#include <windows.h> // Windows平台的头文件
#else
#include <sys/time.h> // Linux平台的时间相关头文件
#endifusing namespace std;// 获取当前时间,填充到timeval结构体中
void getNow(timeval *tv);// 获取当前时间的毫秒数
int64_t getNowMs();// 宏定义用于当前时间
#define TNOW
#define TNOWMS // 获取当前时间
getNow()
// 获取当前时间的毫秒数
getNowMs()////*** @file zero_thread_pool.h* @brief 线程池类, 采用C++11实现** 使用说明:* ZERO_ThreadPool tpool;* tpool.init(5); // 初始化线程池线程数* tpool.start(); // 启动线程池* tpool.exec(testFunction, 10); // 将任务丢到线程池中* tpool.waitForAllDone(1000); // 等待线程池结束,超时1秒* tpool.stop(); // 停止线程池* * 返回值示例:* auto f = tpool.exec(testInt, 5);* cout << f.get() << endl; // 当testInt在线程池中执行后, f.get()会返回数值5*/
class ZERO_ThreadPool
{
protected:struct TaskFunc{TaskFunc(uint64_t expireTime) : _expireTime(expireTime) {}std::function<void()> _func; // 任务的实际函数int64_t _expireTime = 0; // 任务超时时间};typedef shared_ptr<TaskFunc> TaskFuncPtr;public:/*** @brief 构造函数*/ZERO_ThreadPool();/*** @brief 析构函数,停止所有线程*/virtual ~ZERO_ThreadPool();/*** @brief 初始化线程池* @param num 工作线程个数* @return 是否初始化成功*/bool init(size_t num);/*** @brief 获取当前线程池的线程个数* @return 线程个数*/size_t getThreadNum(){std::unique_lock<std::mutex> lock(_mutex);return _threads.size();}/*** @brief 获取当前线程池的任务数* @return 任务数*/size_t getJobNum(){std::unique_lock<std::mutex> lock(_mutex);return _tasks.size();}/*** @brief 停止所有线程,并等待线程结束*/void stop();/*** @brief 启动所有线程* @return 是否成功启动*/bool start();/*** @brief 用线程池执行任务* @param f 任务函数* @param args 任务函数参数* @return 返回任务的future对象*/template <class F, class... Args>auto exec(F&& f, Args&&... args) -> std::future<decltype(f(args...))>{return exec(0, f, args...);}/*** @brief 用线程池执行带有超时的任务* @param timeoutMs 超时时间(毫秒)* @param f 任务函数* @param args 任务函数参数* @return 返回任务的future对象*/template <class F, class... Args>auto exec(int64_t timeoutMs, F&& f, Args&&... args) -> std::future<decltype(f(args...))>{int64_t expireTime = (timeoutMs == 0 ? 0 : TNOWMS + timeoutMs); // 获取当前时间// 推导返回值类型using RetType = decltype(f(args...));// 封装任务auto task = std::make_shared<std::packaged_task<RetType()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));// 创建任务指针并设置超时时间TaskFuncPtr fPtr = std::make_shared<TaskFunc>(expireTime);fPtr->_func = [task]() { (*task)(); }; // 定义任务执行时的具体行为// 加锁并将任务加入任务队列std::unique_lock<std::mutex> lock(_mutex);_tasks.push(fPtr);_condition.notify_one(); // 唤醒等待线程return task->get_future();}/*** @brief 等待所有任务完成* @param millsecond 等待的时间(毫秒),-1表示无限等待* @return 是否所有工作都处理完毕*/bool waitForAllDone(int millsecond = -1);protected:/*** @brief 获取任务* @param task 任务指针* @return 是否成功获取任务*/bool get(TaskFuncPtr& task);/*** @brief 线程池是否退出* @return 是否退出*/bool isTerminate() { return _bTerminate; }/*** @brief 线程运行逻辑*/void run();protected:queue<TaskFuncPtr> _tasks; // 任务队列std::vector<std::thread*> _threads; // 工作线程std::mutex _mutex; // 互斥锁std::condition_variable _condition; // 条件变量size_t _threadNum; // 线程池线程数std::atomic<int> _bTerminate; // 终止标志
};#endif // ZERO_THREADPOOL_H
这个头文件定义了一个多线程线程池类 ZERO_ThreadPool,用于在多个线程之间调度并执行任务。它采用了 C++11 的标准,主要功能包括任务的执行、线程管理、任务队列等,支持任务超时管理。
文件中的主要部分解释
- 头文件和宏定义
#include <future> // 用于future相关操作
#include <functional> // 用于std::bind和function
#include <iostream> // 用于输入输出
#include <queue> // 用于任务队列
#include <mutex> // 用于锁
#include <memory> // 用于智能指针
#ifdef WIN32
#include <windows.h> // Windows平台的头文件
#else
#include <sys/time.h> // Linux平台的时间相关头文件
#endif
这些是本文件中所需的标准库头文件,用于任务管理、线程同步、内存管理和系统相关功能。根据不同平台,windows.h 或 sys/time.h 被包含进来。
- 时间相关函数
// 获取当前时间,填充到timeval结构体中
void getNow(timeval *tv);// 获取当前时间的毫秒数
int64_t getNowMs();
这些函数用于获取当前系统时间,并将其以不同格式返回。getNow 获取精确到微秒的时间,getNowMs 获取精确到毫秒的时间。
- 宏定义
#define TNOW
#define TNOWMS
这些宏本应提供对当前时间的直接调用,但在当前代码中,它们只是占位符。TNOW 和 TNOWMS 可能应该用于返回当前时间(getNow() 和 getNowMs())。
- TaskFunc 结构体
struct TaskFunc
{TaskFunc(uint64_t expireTime) : _expireTime(expireTime) {}std::function<void()> _func; // 任务的实际函数int64_t _expireTime = 0; // 任务超时时间
};
TaskFunc 用于封装任务及其超时时间。_func 是实际的任务函数,_expireTime 是任务的超时时间(如果有)。
- ZERO_ThreadPool 类
这是线程池类的定义,包含了初始化、任务执行、线程管理等功能。
- 构造函数和析构函数
ZERO_ThreadPool();
virtual ~ZERO_ThreadPool();
构造函数初始化线程池,析构函数清理线程池并停止所有线程。
- 初始化函数
bool init(size_t num);
初始化线程池,num 为线程数,成功返回 true,失败返回 false。
- 获取线程数和任务数
size_t getThreadNum();
size_t getJobNum();
获取当前线程池中的线程数和任务数。都使用了互斥锁 std::mutex 来保证线程安全。
- 停止线程池
void stop();
停止线程池中的所有线程。
- 启动线程池
bool start();
启动线程池中的所有线程。
- 任务执行
template <class F, class... Args>
auto exec(F&& f, Args&&... args) -> std::future<decltype(f(args...))>;
提交任务到线程池,f 是任务函数,args 是任务的参数。返回一个 std::future 对象,用于获取任务的结果。
还有一个重载版本,允许指定超时时间:
template <class F, class... Args>
auto exec(int64_t timeoutMs, F&& f, Args&&... args) -> std::future<decltype(f(args...))>;
timeoutMs 指定任务的超时毫秒数。
- 等待所有任务完成
bool waitForAllDone(int millsecond = -1);
等待所有任务完成。millsecond 指定超时时间,默认为 -1,表示无限等待。
- 获取任务
bool get(TaskFuncPtr& task);
从任务队列中获取任务。
- 线程运行逻辑
void run();
线程池的工作线程会调用此函数,它的主要职责是从任务队列中取任务并执行。
- 保护成员变量
- _tasks: 任务队列,存储待执行的任务。
- _threads: 工作线程的列表。
- _mutex: 保护任务队列的互斥锁。
- _condition: 条件变量,用于通知工作线程有新的任务到来。
- _threadNum: 线程池中的线程数。
- _bTerminate: 线程池是否终止的标志。
总结
这个线程池类通过以下方式实现多线程任务管理:
- 支持动态提交任务,任务可以有超时设置。
- 通过互斥锁和条件变量保证线程安全和任务调度。
- 提供了等待任务完成的功能,防止主线程提前退出。
- 支持跨平台,Windows 和 Linux 系统可以使用。
这种设计非常适合需要高并发和任务调度的场景,能有效地利用多个线程来执行任务,提高系统效率。
相关文章:
C++新特性||线程协程(代码解析1)
原文https://blog.csdn.net/ke_wu/article/details/144807820?sharetypeblogdetail&sharerId144807820&sharereferPC&sharesourceke_wu&spm1011.2480.3001.8118 #ifndef ZERO_THREADPOOL_H #define ZERO_THREADPOOL_H#include <future> // 用于…...
《成瘾-在放纵中寻找平衡》
安娜伦布克(Anna Lembke)是美国著名的精神病学家、成瘾医学专家以及《多巴胺国度》(Dopamine Nation)的作者。她在书中深入探讨了现代社会中的成瘾问题,并结合科学研究与临床经验,揭示了为什么现代人更容易…...
Docker搭建Skywalking
Docker搭建Skywalking 虚拟机IP:192.168.0.109Nacos服务地址:http://192.168.0.109:8848/nacosMySQL服务: IP:192.168.0.109端口:3306用户名:root密码:root ElasticSearch服务: IP&a…...
Vue axios 异步请求,请求响应拦截器
在 Vue.js 中使用 axios 进行网络请求是非常常见的做法,因为它提供了比原生的 Fetch API 更丰富的功能,并且更易于处理错误和配置。结合 Axios 的拦截器功能,你可以对所有的请求或响应进行预处理,比如添加认证头信息、统一处理错误…...
解决 ffmpeg “Unknown encoder ‘hevc_nvenc‘“
目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: ffmpeg 剪切视频 问题描述 详细报错: [vost#0:0 @ 0x46ae00] Unknown encoder hevc_nvenc 原因分析: ffmpeg 安装错误 解决方案: 重新安装ffmpeg: conda install ffmpeg 检查当前安装的 FFmpeg 是否支…...
Kafka安全优化文档:漏洞修复到安全加固
文章目录 1.1.漏洞修复1.1.1.Apache Kafka反序列化漏洞1.1.2.pm2-kafka代码执行漏洞1.1.3.Apache Kafka安全绕过漏洞1.1.4.Apache Kafka Distribution - Schema Repository跨站请求伪造漏洞1.1.5.Apache Kafka输入验证错误漏洞的补丁1.1.6.Apache Kafka信息泄露漏洞1.1.7.Apach…...
Django 中数据库迁移命令
在 Django 中,python manage.py makemigrations、python manage.py sqlmigrate polls 0003 和 python manage.py migrate 是与数据库迁移相关的重要命令。它们的作用和对应内容如下: 1. python manage.py makemigrations 功能: 此命令会根据你的模型文…...
2024 高通边缘智能创新应用大赛智能边缘计算赛道冠军方案解读
2024 高通边缘智能创新应用大赛聚焦不同细分领域的边缘智能创新应用落地,共设立三大热门领域赛道——工业智能质检赛道、智能边缘计算赛道和智能机器人赛道。本文为智能边缘计算赛道冠军项目《端侧大模型智能翻译机》的开发思路与成果分享。 赛题要求 聚焦边缘智能…...
前端超大缓存IndexDB、入门及实际使用
文章目录 往期回顾项目实战初始化表获取列表新增表的数据项获取详情根据ID获取详情根据其他字段获取详情 删除数据 总结 往期回顾 在之前的文章中,我们介绍了IndexDB vs Cookies vs Session这几个的对比,但是没有做实际项目的演示,今天我们用…...
[创业之路-229]:《华为闭环战略管理》-5-平衡记分卡与战略地图
目录 一、平衡记分卡 1. 财务角度: 2. 客户角度: 3. 内部运营角度: 4. 学习与成长角度: 二、BSC战略地图 1、核心内容 2、绘制目的 3、绘制方法 4、注意事项 一、平衡记分卡 平衡记分卡(Balanced Scorecard&…...
形象地理解UE4中的数据结构 TLinkedListBase
大家都熟知链表,但不一定能快速看懂UE4中的数据结构。 TLinkedListBase表示“链接”中的一个结点,有三个成员: 一、ElementType Element; 表示具体的业务,例如int链条中的一个整数。 二、NextLink 表示 “下一个Node”&#…...
如何在谷歌浏览器中创建安全的密码
在数字化时代,网络安全变得日益重要。谷歌浏览器提供了多种工具和功能帮助用户创建和管理强密码,确保在线账户的安全。本文将简要介绍几种方法,帮助您在谷歌浏览器中创建和管理安全密码。 一、启用自动填充功能 确认密码保存功能已开启&…...
Nginx1.20.2-Linux-安装
文章目录 1.下载压缩包1.官网下载2.找到1.20.23.百度网盘 2.Linux安装1.搭建gcc环境2.上传到 /usr/local/nginx1.20.23.解压1.解压到当前目录2.删除压缩包 4.配置Nginx的编译路径1.进入nginx-1.20.22.执行内部的脚本,指定编译路径为/usr/local/nginx 5.编译并安装6.…...
网页版3D预览插件3dfindit
需求背景 如果你需要在浏览器上显示3D的模型,那么你可以看看这个3dfindit。不需要专业的代码开发,上传模型或者图片就行,他会自动生成3D预览。 效果图 // 效果图预览地址https://ksb-embedded.partcommunity.com/3d-cad-models/boa-compact…...
产品经理2025年展望
产品经理作为连接技术、设计与市场需求的桥梁,在快速变化的商业环境中扮演着至关重要的角色。展望2025年,随着技术的不断进步和消费者需求的日益多样化,产品经理的工作将面临更多挑战与机遇。 一、人工智能与自动化深化应用: 到…...
计算机找不到xinput1_3.dll无法执行怎么办?电脑缺失xinput1_3.dll文件怎么修复?
当计算机提示找不到xinput1_3.dll文件,导致某些程序或游戏无法执行时,可以采取以下步骤来修复这个问题: 一、了解xinput1_3.dll文件 xinput1_3.dll是Microsoft DirectX for Windows的控制模块,它包含了一组函数和数据结构&#…...
揭秘 Fluss 架构组件
这是 Fluss 系列的第四篇文章了,我们先回顾一下前面三篇文章主要说了哪些内容。 Fluss 部署,带领大家部署Fluss 环境,体验一下 Fluss 的功能Fluss 整合数据湖的操作,体验Fluss 与数据湖的结合讲解了 Fluss、Kafka、Paimon 之间的…...
你了解DNS吗?
你了解DNS吗? 一. 介绍二. DNS的工作原理三. DNS查询流程示意图四. DNS 记录类型五. DNS的安全问题与 DNSSEC 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 介绍 …...
pyinstaller打包exe可执行文件
cd命令符进入要打包文件路径下,执行: 1.打包单个py文件,在控制台执行;dist下会生成2个文件,一个是exe文件 pyinstaller -D happy.py (cd命令符进入要打包文件路径下,执行) 打包单个py文件,在控制台执行;…...
leetcode108:将有序数组转化为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…...
rust学习-初识rust
rust学习-初识rust 什么是 Rust?Rust 的特点什么是 Cargo?Cargo 的主要功能使用 Cargo 创建和管理项目Cargo.toml 文件详解常用 Cargo 命令什么是 Rustup?Rustup 的主要功能安装 Rustup验证安装使用 Rustup 管理工具链使用 Rustup 管理目标平…...
word怎么添加链接,点击直接到参考文献
word怎么添加链接,点击直接到参考文献 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 在Word中添加点击可直接跳转到参考文献的链接,主要有以下两种方法: 使用交叉引用和超链接结合的方法 插入参考文献: 首先,在文档中需要插入参考…...
数字赋能:制造企业如何靠“数字能力”实现可持续“超车”?
如今,制造业数字化转型可是个热门话题,全球都在积极推进。我国更是出台了一系列给力的政策来助力制造业数字化转型,像《中国制造 2025》就明确提出要加快制造业数字化、网络化、智能化发展,各省市也纷纷响应,从资金、税…...
C++——deque的了解和使用
目录 引言 标准库中的deque 一、deque的基本概念 二、deque的常用接口 1.deque的迭代器 2.deque的初始化 3.deque的容量操作 3.1 有效长度和容量大小 3.2 有效长度和容量操作 4.deque的访问操作 5.deque的修改操作 三、deque的应用场景 结束语 引言 在C中&#x…...
vue使用el-select下拉框自定义复选框
在 Vue 开发中,高效且美观的组件能极大地提升用户体验和开发效率。在vue中使用elementplus 的 el-select下拉框实现了一个自定义的多选下拉框组件。 一、代码功能概述 这段代码创建了一个可多选的下拉框组件,通过el-select和el-checkbox-group结合的方…...
《探秘开源大模型:AI 世界的“超级引擎”》
《探秘开源大模型:AI 世界的“超级引擎”》 一、开源大模型崛起之路二、开源大模型发展历程回顾(一)早期奠基:理论突破与初步实践(二)快速发展:百花齐放的模型格局(三)当下态势:走向成熟与多元融合三、开源大模型核心技术剖析(一)Transformer 架构:基石之稳(二)…...
浏览器跨域原因及解决方式
一、为什么会有跨域 浏览器的同源策略 用于限制一个源的文档或它所加载的脚本如何能与另一个源交互。 它能帮助阻隔恶意文档,减少可能被攻击的媒介 二、什么是同源 两个url,只要它们的协议、域名、端口有一个不相同,就会导致跨域…...
如何解决Eigen和CUDA版本不匹配引起的错误math_functions.hpp: No such file or directory
Apollo9针对RTX40的docker环境里的Eigen库版本是3.3.4,CUDA是11.8: 编译我们自己封装模型的某些component代码时没问题,编译一个封装occ模型的component代码时始终报错: In file included from /usr/include/eigen3/Eigen/Geometry:11:0, …...
[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程
1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 :分区定位ÿ…...
idea项目导入gitee 码云
1、安装gitee插件 IDEA 码云插件已由 gitosc 更名为 gitee。 1 在码云平台帮助文档http://git.mydoc.io/?t153739上介绍的很清楚,推荐前两种方法, 搜索码云插件的时候记得名字是gitee,gitosc已经搜不到了。 2、使用码云托管项目 如果之…...
前端页面展示本电脑的摄像头,并使用js获取摄像头列表
可以通过 JavaScript 使用 navigator.mediaDevices.enumerateDevices() 获取电脑上的摄像头列表。以下是一个示例代码,可以展示摄像头列表并选择进行预览。 HTML JavaScript 实现摄像头列表展示和预览 <!DOCTYPE html> <html lang"zh-CN">…...
小米自研vela系统kvdb数据库的使用(一)
KVDB数据库介绍 KVDB 数据库详细介绍KVDB 的基本原理 KVDB 的应用场景1. 缓存系统2. 配置管理3. 会话存储与用户状态管理4. 实时数据处理5. 日志记录与事件存储6. 分布式存储 KVDB 的作用KVDB 数据库的典型实现1. LevelDB2. RocksDB3. LMDB (Lightning Memory-Mapped Database)…...
Python 中的 `iter` 函数
因为在jax的代码接触了这个函数,不是很熟悉,每次看见名字只知道是迭代但是不知道是怎么迭代,因此写下以下笔记提醒自己。 def iter(source, sentinelNone): # known special case of iter"""iter(iterable) -> iteratorit…...
【AIGC】电话录音转文字实践:基于Google Cloud Speech-to-Text-v1的技术方案Python
引言 在当今数字化时代,将语音内容转换为文字已经成为一个非常重要的技术需求。无论是客服通话记录、会议纪要,还是电话采访内容,高效准确的语音转文字服务都能大大提升工作效率。本文将详细介绍如何利用Google Cloud Speech-to-Text服务实现…...
《AI赋能自由职业:开启竞争力提升新征程》
在当今数字化时代,AI技术为自由职业者带来了前所未有的机遇,使其能够在激烈的市场竞争中脱颖而出。以下是自由职业者借助AI提升自身竞争力的几种方法。 利用AI优化工作流程,提高效率 自动化任务处理:自由职业者可以借助自动化工具…...
学习vue3的笔记
一、vue和react的对比 1、基础介绍 vue:https://cn.vuejs.org/ vue3是2020年创建的 react:https://react.dev/ react是一个2013年开源的JavaScript库,严格意义上来说不是一个框架 2、diff算法 两个框架采用的都是同级对比策略 两节点对…...
为什么要用ZGC
一、为什么要用 ZGC 问题 我们有个“智慧园区”的项目,我们的下游系统“交叉带”[硬件系统]要求我们服务 60ms内返回结果,并且可用性要达到 99.99%。当时使用的是 G1垃圾回收器,单次 Young GC 40ms,一分钟10次,接口平均响应时间…...
rm误删掉的文件夹/文件如何恢复
Linux环境rm不小心误删掉文件/文件夹如何安全恢复,推荐tool:ext4magic(ext4 or ext3),大家如果遇到误删的,希望可以帮到你。 误删了,最好要保留现场,如果能umout当前分区最好,不要在当前磁盘分…...
uniapp - 小程序实现摄像头拍照 + 水印绘制 + 反转摄像头 + 拍之前显示时间+地点 + 图片上传到阿里云服务器
前言 uniapp,碰到新需求,反转摄像头,需要在打卡的时候对上传图片加上水印,拍照前就显示当前时间日期地点,拍摄后在呈现刚才拍摄的图加上水印,最好还需要将图片上传到阿里云。 声明 水印部分代码是借鉴的…...
南方电网场景中 Agent 的智慧赋能与创新实践(15/30)
一、南方电网的数字化变革浪潮 在当今时代,能源领域正经历着深刻的变革,南方电网作为我国电力供应的重要支柱,面临着诸多挑战与机遇。随着经济的快速发展,用电需求持续攀升,电力负荷峰谷差日益增大,给电网的…...
rk3399增加新分区和计算规则
如果想要添加一个新的分区,例如添加名为"userdata"的分区,大小为,除了预留6G的system文件系统根目录分区(我这里是rootfs分区),剩下的空间全部给userdata。 需要首先确定这个分区的起始地址。这个…...
风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注
风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注 数据集下载 yolov11: https://download.csdn.net/download/pbymw8iwm/90206849 yolov…...
计算机网络-L2TP VPN基础实验配置
一、概述 上次大概了解了L2TP的基本原理和使用场景,今天来模拟一个小实验,使用Ensp的网卡桥接到本地电脑试下L2TP拨号,今天主要使用标准的L2TP,其实在这个基础上可以加上IPSec进行加密,提高安全性。 网络拓扑 拓扑说明…...
QT集成IntelRealSense双目摄像头2,集成OpenGL
上一篇文章写了如何把IntelRealSense摄像头的SDK集成到QT项目,并成功采集数据,在没有用OpenCV的情况下完成色彩数据,以及深度数据的显示。 具体地址:https://blog.csdn.net/qujia121qu/article/details/144734163 本次主要写如何…...
MySQL数据库——索引结构之B+树
本文先介绍数据结构中树的演化过程,之后介绍为什么MySQL数据库选择了B树作为索引结构。 文章目录 树的演化为什么其他树结构不行?为什么不使用二叉查找树(BST)?为什么不使用平衡二叉树(AVL树)&a…...
基于SpringBoot+Vue的旅游推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
HTML——20 自定义属性
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>自定义属性</title></head><body><a href"https://ai.m.taobao.com" 自定义属性"属性值">淘宝网</a><a href"h…...
Java Day1回顾简介-----变量命名规则
Java 简介、开发环境配置 菜鸟教程 编译运行 javac HelloWorld.java java HelloWorld Hello World public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World");} }JAVA基础语法 类、对象、方法、实例、变量 对象&a…...
【Rust自学】8.2. Vector + Enum的应用
8.2.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编…...
机器算法之逻辑回归(Logistic Regression)详解
一、什么是逻辑回归? 逻辑回归并不是传统意义上的回归分析,而是一种用于处理二分类问题的线性模型。它通过计算样本属于某一类别的概率来进行分类,尽管名字中有“回归”二字,但它实际上是一种分类算法。简单来说,逻辑…...