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

智能指针之设计模式6

本系列文章探讨了智能指针和设计模式的关系,前面五篇文章介绍的是使用设计模式实现了智能指针的相关特性,比如使用工厂模式控制了智能指针对象的创建,使用代理模式控制了资源对象的销毁。本文介绍一下使用智能指针来帮助我们实现相关的设计模式。

1、在创建型设计模式中,既然是创建对象,肯定要涉及到对象的生存期管理,那么用智能指针来实现创建型的设计模式就再正常不过了。

首先看工厂方法模式的例子:

使用工厂方法模式创建对象时,一般都是在堆上创建的,建议使用unique_ptr来返回创建的对象实例,因为使用unique_ptr更灵活,这样最终可以支持unique_ptr或者shared_ptr类型的智能指针来管理产品对象的生存期,如果要想使用shared_ptr类型的智能指针,用户可以根据需要把它转换成shared_ptr类型,但是如果反过来,让工厂方法返回shared_ptr类型的话,就无法满足用户使用unique_ptr指针的要求。比如:

// 产品基类
class product {
public:virtual ~product() = default;
};// 工厂基类
class factory {
public:virtual unique_ptr<product> create_product() const = 0;virtual ~factory() = default;
};// 具体产品类
class productA : public product {
};// 具体工厂类
class factoryA : public factory {
public:unique_ptr<product> create_product() const {return make_unique<productA>();}
};// 只使用unique_ptr的应用场景
void test1(const factory &fac) {unique_ptr<product> up = fac.create_product();//...
}// 使用shared_ptr的应用场景
void test2(const factory &fac) {unique_ptr<product> &&up = fac.create_product();// 如果要使用shared_ptr,可以把unique_ptr对象转化为shared_ptr对象shared_ptr<product> sp(move(up));//...
}

再看一个使用智能指针管理单例对象的例子:在程序退出后,释放单例资源。如果单例对象是在堆上创建的,因为单例对象的生存周期不需要程序管理,可以使用裸指针类型来访问单例。假设在程序退出后,希望能够销毁单例对象,因为没有合适的地方去delete这个单例指针,可以借助于智能指针来实现这个功能。比如下面的实现例子:

class singleton {static singleton *instance;singleton() = default;~singleton() = default;
public:static singleton *get_instance();static void destroy(singleton *ptr) {delete ptr;}
};singleton *singleton::instance = nullptr;
// unique_ptr对象来管理单例对象的生存期
unique_ptr<singleton, void(*)(singleton*)> singleton_helper(nullptr, singleton::destroy);singleton *singleton::get_instance() {if (instance == nullptr) {instance = new singleton();// 创建单例对象之后,放入unique_ptr对象中singleton_helper.reset(instance);}return instance;
}

2、在其它模式中,凡是涉及到要引用一个对象时,可以考虑使用shared_ptr管理对象,这样对象之间就不用考虑使用裸指针来引用对象时的生存期问题了,它的生存期完全交由shared_ptr来管理。

设计模式中涉及到多个对象之间的组合起来一起工作,而且大都是基于基类作为接口的,为了实现面向对象的多态机制,交互传递的都是指针引用类型。这样就涉及到对象的生存期管理了,更重要的是有时候有一个对象会被多个对象引用,如何管理这个对象的生存期呢,它归谁所有呢?既然是共同使用的,因此使用了shared_ptr,如果有互相引用的场景,就考虑一方使用weak_ptr。例如,在实现享元模式时,因为享元对象必须被共享,所以可以使用shared_ptr来引用享元对象。像其它的模式,比如桥梁模式、观察者模式,还有PIMPL惯用法,也一般也会用到shared_ptr。这也是shared_ptr典型的应用场景,比较简单,就不再举例说明了。

当然,如果一方在失去生存期时需要同时解除引用关系,也可以使用weak_ptr类型。例如,观察者模式中的观察者对象,在需要主题对象给它发送通知时,把观察者对象注册到主题中去,通常情况下,当一个观察者失去生存期时要从主题中注销掉,也可以不用去注销,那就在主题中使用weak_ptr来保存观察者,看下面的例子:

// 观察者基类
class observer {
public:virtual void update() = 0;//   ...virtual ~observer() = default;
};// subject对象一般要比observer对象活得时间长
class subject {// Observer的生存期没有和Subject紧密绑定,使用weak_ptr存放vector<weak_ptr<observer>> list;
public:void regist(weak_ptr<observer> observ) {list.push_back(observ);}void notify() {for (auto weak : list) {auto shared = weak.lock();if (shared) {shared->update();} else {...从list中删除weak }}}
};class my_observer : public observer {
public:virtual void update() {...}
};

在这里,观察者在Subject对象中注册时,使用了weak_ptr类型,这样如果一个观察者失去了生存期被销毁后,可以不用向Subject对象进行注销操作。这样,当Subject在向所有注册的观察者发送通知时,先对观察者进行检查,如果发现它一个观察者已经销毁了,就把它从注册表中移除,这样就简化了观察者一方的流程,只注册就可以了。

结语

本系列文章介绍的只是智能指针在设计和实现时所体现出的设计模式的思想,如果纯粹从面向对象编程上来说,它们没有那么分明的类层次体系,有的甚至连类都没有,并不是严格意义上面向对象的设计模式,和GOF经典设计模式在外在形式上有所差别。

首先它们都使用了模板技术,模板技术的特点是鸭式辩型(duck type),只要提供的类型中有符合形式的接口(比如函数或者操作符)就可以了,并不像面向对象编程那样,接口函数需要使用基类来定义,派生类来继承并重写这些接口函数。其次,C++有操作符重载,在某些场合中可以无需像传统的面向对象那样叠床架屋般的设计一套接口基类,只要模板的实参类型类符合相关函数接口(如操作符)就可以了。比如,C++17中的variant类模板和visit()函数模板,就可以替换GOF的访问者模式,无需再严格地按照面向对象技术去编写那些element类和visitor类以及它们的派生类了。

总之,不管形式如何,重点是理解它们所体现出的设计模式的思想,如果仔细体会智能指针的实现方案及机制,它们的确符合这些模式背后的思想,熟悉设计模式的朋友不妨认真体会一下,相信会大有收获的:

工厂模式控制了资源对象的创建过程。工厂模式在控制智能指针对象创建过程的同时,也控制了资源对象使用new在堆上的创建,如make_unique()和make_shared(),也控制了shared_ptr对象从this指针创建的过程,如shared_from_this();

代理模式控制了资源对象的销毁过程。代理模式可以控制资源对象在智能对象失去生存期时也立即销毁,如unique_ptr,也可以控制它在最后一个引用它的智能指针对象失去生存期时再销毁,如shared_ptr。

策略模式实现了删除器的灵活性。为了让智能指针能够灵活地控制不同资源的销毁过程,还使用策略模式设计了删除器的角色,通过删除器可以让之智能指针在管理资源方面能够扮演更多的角色。

模板方法模式简化了用户通过this创建shared_ptr对象的实现。通过模板方法模式,在模板类enable_shared_from_this中封装了通过this指针创建shared_ptr对象的过程,即模板方法,只要派生类对象被一个shared_ptr对象托管就可以了,即等同于钩子方法,简化了用户的工作量和犯错的可能。

此外,为了让智能指针支持二维指针的访问和操作,还按照适配器模式为它们实现了访问二维指针类型的接口。

相关文章:

智能指针之设计模式6

本系列文章探讨了智能指针和设计模式的关系&#xff0c;前面五篇文章介绍的是使用设计模式实现了智能指针的相关特性&#xff0c;比如使用工厂模式控制了智能指针对象的创建&#xff0c;使用代理模式控制了资源对象的销毁。本文介绍一下使用智能指针来帮助我们实现相关的设计模…...

【设计模式】GOF概括

一、创建型模式&#xff08;5种&#xff09; 1. 单例模式 (Singleton) 适用场景&#xff1a;全局唯一实例&#xff08;如配置管理、日志工具&#xff09;。C示例&#xff1a;// 所谓的scott mayer单例模式 class Singleton { public:static Singleton& getInstance() {st…...

深入浅出限流算法(三):追求极致精确的滑动日志

在限流的世界里&#xff0c;精度往往是关键。我们已经讨论过固定窗口&#xff08;简单但有突刺&#xff09;和滑动窗口&#xff08;更平滑但仍有格子边界&#xff09;。如果我们需要更精确的控制&#xff0c;滑动日志 (Sliding Log) 算法便登场了。 核心思想&#xff1a;记录每…...

一文读懂Tomcat应用之 CentOS安装部署Tomcat服务

目录 一、Tomcat概述 (一)、Tomcat安装目录简介 (二)、Tomcat配置文件简介 1、server.xml文件 2、web.xml 3、context.xml 4、tomcat-users.xml 5、logging.properties 二、Tomcat安装部署 (一)、环境规划 (二)、安装JDK 1、下载JDK二进制安装包 2、解压JDK二进制…...

JVM 内存分配策略

引言 在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率&#xff0c;而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理&am…...

轻松上手:使用 Docker Compose 部署 TiDB 的简易指南

作者&#xff1a;ShunWah 在运维管理领域&#xff0c;我拥有多年深厚的专业积累&#xff0c;兼具坚实的理论基础与广泛的实践经验。精通运维自动化流程&#xff0c;对于OceanBase、MySQL等多种数据库的部署与运维&#xff0c;具备从初始部署到后期维护的全链条管理能力。拥有Oc…...

Linux权限管理

权限的概念 在 Linux 系统里&#xff0c;权限管理是系统安全的关键环节。权限管理的核心目的是明确不同用户对文件和目录的操作许可范围&#xff0c;以此来保障系统资源的安全与合理使用。权限管理涉及三种不同的用户角色和三种基本的操作权限。 用户角色 所有者&#xff08…...

Crusader Kings III 王国风云 3(十字军之王 3) [DLC 解锁] [Steam] [Windows SteamOS macOS]

Crusader Kings III 王国风云 3&#xff08;十字军之王 3&#xff09; [DLC 解锁] [Steam] [Windows & SteamOS & macOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明&#xff1b; DLC 解锁列表&#xff08;仅供参考&am…...

架构风格对比

架构风格深度对比&#xff1a;从管道-过滤器到微内核 &#x1f4dc; 引言 在软件架构设计中&#xff0c;不同的架构风格适用于不同的业务场景。本文将深入解析 7种主流架构风格&#xff0c;包括它们的核心思想、优缺点、适用场景&#xff0c;并通过对比表格和示例帮助您选择最…...

V Rising 夜族崛起 [DLC 解锁] [Steam] [Windows SteamOS]

V Rising 夜族崛起 [DLC 解锁] [Steam] [Windows & SteamOS] 注意 这个符号表示 可打开折叠内容 需要有游戏正版基础本体&#xff0c;安装路径不能带有中文&#xff0c;或其它非常规拉丁字符&#xff1b;仅限用于自建服务器&#xff0c;并禁用 VAC &#xff01;&#xff0…...

HTML标记语言_@拉钩教育

目录 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个页面) 8.多媒体标签(音/视频) 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个…...

云原生开发革命:iVX 如何实现 “资源即插即用” 的弹性架构?

云原生技术正以惊人的速度重塑软件开发的版图。短短几年间&#xff0c;它从少数技术先驱的实验性方案&#xff0c;迅速崛起为全球企业数字化转型的核心驱动力。Gartner 预测&#xff0c;到 2026 年&#xff0c;全球 85% 的企业将全面采用云原生技术进行应用开发与部署。云原生架…...

whois为什么有时会返回两个不同的域名状态

前阵子发现一直想注册但被别人注册了的一个域名快要过期了&#xff0c;就想着写个脚本跑在电脑上&#xff0c;每分钟检查一次域名状态&#xff0c;一旦域名被正式删除&#xff0c;就发封邮件通知我&#xff0c;这样就不用频繁手动检查域名状态了。 写脚本时发现一个有趣的现象…...

跨境电商店铺矩阵布局:多账号运营理论到实操全解析

在当今竞争激烈的全球电商市场中&#xff0c;跨境电商店铺矩阵布局已成为卖家脱颖而出的关键策略。本文将深入剖析跨境电商店铺矩阵布局的本质、优势&#xff0c;并提供从理论到实操的全方位指导&#xff0c;助力您在全球市场中开启属于自己的销售新篇章。 一、是什么&#xff…...

安卓基础(强制转换)

​​一、强制转换&#xff08;Type Casting&#xff09;​​ ​​1. 什么是强制转换&#xff1f;​​ 当你想将一个类型的对象转换为另一个类型时&#xff0c;如果它们之间存在继承关系&#xff0c;就需要​​强制转换​​。 ​​注意​​&#xff1a;只有存在继承关系的类型…...

VS2022+OpenCasCade配置编译

一、Open CASCADE Technology介绍及安装&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;简称OCCT&#xff09;是一款开源的 3D CAD/CAM/CAE 软件开发平台&#xff0c;广泛应用于工业设计、工程仿真、制造等领域。开源OCC对象库是一个面向对象C类库&…...

AIGC重构元宇宙:从内容生成到沉浸式体验的技术革命

1. 引言 当数字技术掀开人类交互的新篇章&#xff0c;元宇宙正从科幻构想蜕变为现实——这个由虚拟与现实交织的数字宇宙&#xff0c;承载着未来社会的娱乐、工作与社交形态。作为核心赋能技术&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;正以惊人的创造力&…...

当所有人都用上先进ai,如何保持你的优势?

这不再是你能用上openai模型别人只能用文心一言的时候&#xff0c;而是每个人都可以免费用deepseek r1的时代。如今&#xff0c;办公室里每个人都能随时调用deepseek模型&#xff0c;喊一声“帮我写段代码”便轻松解决问题。在这种情况下&#xff0c;单纯“会用AI”已经很难再形…...

【浙江大学DeepSeek公开课】人类经验与AI算法的镜像之旅

人类经验与AI算法的镜像之旅 人类经验与 AI 算法的镜像之旅一、语言的奥秘&#xff1a;人类如何解码世界二、从符号到智能&#xff1a;AI 的语言理解之路三、DeepSeek - V3&#xff1a;大语言模型的构建与进化四、DeepSeek - R1&#xff1a;推理模型的诞生与突破五、智能体时代…...

【前端】从零开始的搭建顺序指南(技术栈:Node.js + Express + MongoDB + React)book-management

项目路径总结 后端结构 server/ ├── controllers/ # 业务逻辑 │ ├── authController.js │ ├── bookController.js │ ├── genreController.js │ └── userController.js ├── middleware/ # 中间件 │ ├── authMiddleware…...

探针台维护方法

探针台的维护直接影响其测试精度与使用寿命&#xff0c;需结合日常清洁、环境控制、定期校准等多维度操作&#xff0c;具体方法如下&#xff1a; 一、日常清洁与保养 1.‌表面清洁‌ 使用无尘布或软布擦拭探针台表面&#xff0c;避免残留清洁剂或硬物划伤精密部件。探针头清…...

js day8

事件绑定 事件&#xff1a;发生在html元素上的特定动作&#xff0c;鼠标点击&#xff0c;键盘按下&#xff0c;鼠标移入 事件三要素&#xff1a;事件源&#xff08;触发事件的元素&#xff09; 事件类型&#xff0c;事件触发后执行的函数 通过html触发事件&#xff08;不建议…...

大模型训练平台:重构 AI 研发范式的智慧基建

当 AI 研发陷入“高耗低效”困局&#xff0c;如何破局&#xff1f; 在大模型技术爆发的今天&#xff0c;企业 AI 研发正面临前所未有的挑战&#xff1a;某金融机构为训练风控模型投入大量算力&#xff0c;却因数据标注耗时半年延误项目&#xff1b;某制造企业搭建的训练集群利…...

vuex刷新数据丢失解决方案-vuex-persist

安装 npm install -S vuex-persist&#xff08;yarn add vuex-persist&#xff09; 使用&#xff1a; /store/index.js引入vuex-persist配置&#xff1a; import Vue from vue import Vuex from vuex import VuexPersistence from vuex-persist import user from ./modules/use…...

多模态革命!拆解夸克AI相机技术架构:如何用视觉搜索重构信息交互?(附开源方案对比)

一、技术人必看&#xff1a;视觉搜索背后的多模态架构设计 夸克「拍照问夸克」功能绝非简单的OCRQA拼接&#xff0c;而是一套多模态感知-推理-生成全链路系统&#xff0c;其技术栈值得开发者深挖&#xff1a; 视觉编码器&#xff1a;基于Swin Transformer V2&#xff0c;支持4…...

Python依据卫星TLE轨道根数,计算可见时间窗口

1.卫星TLE数据 概括&#xff1a;两行字符串表示的卫星参数 字段 字符串位置&#xff08;以0为起点&#xff09; 描述内容注释1 01–01卫星编号203-07卫星类别卫星类别&#xff08;U表示不保密&#xff0c;可供公众使用的&#xff1b;C 表示保密&#xff0c;仅限NORAD使用&…...

C++?模板!!!

一、引言 在之前我们一起学习了C中类和对象、动态内存管理等相关知识&#xff0c;今天我们将一起学习C中有关模板的相关知识&#xff0c;学完模板之后我们就可以进入C中非常重要的库---STL了&#xff0c;那么模板究竟有什么奥秘呢&#xff1f;让我们一起来看看吧&#xff01; …...

web技术与nginx网站服务

一、Web服务基础概念 Web服务器核心功能 通过HTTP/HTTPS协议提供网页内容&#xff0c;支持HTML、CSS、JavaScript等静态资源&#xff0c;动态内容需结合后端语言&#xff08;如PHP、Python&#xff09;处理36。常用软件&#xff1a;Nginx、Apache、Lighttpd。Nginx以高并发、低…...

关系数据的可视化

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装Python所需要的第三方模块 二、实验 【实验总结】 【实验目的】 1.掌握关系数据在大数据中的应用 2.掌握关系数据可视化方法 3. python 程序实现图表 【实验原理】 在传统的观念里面&#xff0…...

MATLAB小试牛刀系列(1)

问题描述 某机床厂生产甲、乙两种机床&#xff0c;每台机床销售后的利润分别为 4 千元与 3 千元。生产甲机床需用 A、B 机器加工&#xff0c;加工时间分别为每台 2h 和每台 1h&#xff1b;生产乙机床需用 A、B、C 三种机器加工&#xff0c;加工时间均为每台 1h。若每天可用于加…...

CUDA、pytorch、配置环境教程合集

1.CUDA卸载 参考&#xff1a; 【环境搭建】卸载&重新安装cudacudnnanacondagpu版pytorch_卸载cuda-CSDN博客 【cuda】cuda安装与卸载升级_升级cuda-CSDN博客 检测代码&#xff1a; https://www.zhihu.com/question/482335084 import torch print(CUDA版本:,torch.vers…...

代码随想录打卡|Day29 动态规划Part02(不同路径、不同路径2、整数拆分、不同的二叉树搜索)

动态规划Part02 不同路径 力扣题目链接 代码随想录链接 视频讲解链接 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xf…...

Leetcode刷题 | Day49_图论01

一、学习任务 深度优先搜索理论基础深度优先搜索理论基础 | 代码随想录98. 所有可达路径(ACM)797. 所有可能的路径(Leetcode)广度优先搜索理论基础 二、具体题目 1.深度优先搜索理论基础 类似回溯算法&#xff0c;二叉树的前中后序遍历是其在二叉树领域的应用。 代码框架&am…...

if consteval

if consteval 是 C23 引入的新特性&#xff0c;该特性是关于immediate function 的&#xff0c;即consteval function。用于在编译时检查当前是否处于 立即函数上下文&#xff08;即常量求值环境&#xff09;&#xff0c;并根据结果选择执行不同的代码路径。它是对 std::is_con…...

【iOS】OC源码阅读——alloc源码分析

文章目录 前言基本调试方法allocalloc函数逐步调试空类检查快速路径&#xff1a;默认内存分配慢速路径&#xff1a;自定义内存分配slowpath和fastpath alloc核心操作cls->instanceSize&#xff1a;计算所需内存大小内存字节对齐原则为什么要16字节对齐内存字节对齐总结 其他…...

[JavaScript]对象关联风格与行为委托模式

对象关联. “[[prototype)]的机制就是存在于对象中的一个内部链接,它会引用其它对象” 为何创建原型链(关联)? Object.create()会创建一个新对象,参数对象会作为新对象的__proto__. “我们并不需要类来创建两个对象之间的关系,只需要通过委托来关联对象就足够了.而Object.c…...

在 Ubuntu 24.04 LTS 一台机子上同时部署Dify 1.3.1 和 RAGflow 0.18.0

一、RAGflow 0.18.0 简介 有关 Dify 的简介&#xff0c;可以查看我之前分享的 《在 Ubuntu24.04 LTS 上 Docker Compose 部署 Dify 社区版 1.0.1》文章。RAGFlow是一款基于深度文档理解&#xff08;deepdoc&#xff09;构建的开源 RAG引擎。其中&#xff0c;深度文档理解&#…...

小熊派BearPi-Pico H3863(二)环境配置 Ubuntu编译源码与VSCode远程开发指南

BearPi-H3863 Ubuntu编译源码与VSCode远程开发指南 摘要开发环境配置方案选型环境部署实战手册一、基础环境配置1. 镜像准备2. 虚拟机初始化3. 网络异常处理 二、VSCode远程开发配置1. SSH服务验证2. VSCode插件安装3. 远程连接实战4. 项目管理 关键要点总结 摘要 本文针对Bea…...

组装 (DIY) 一台显示器 (4K 屏支持 4 画面分屏 PBP 1080p x4)

首发日期 2025-04-26, 以下为原文内容: 家里的 PC 主机比较多, 如果同时开机, 显示器就不够用了. 因为穷, 窝租住的房间又很小, 放不下很多显示器. 所以, 窝希望买一台支持 分屏 功能的显示器. 最好是 4K 分辨率 (3840x2160) 的屏幕, 然后 4 分屏 (有 4 个 DP 或 HDMI 输入接口…...

SwiftUI 8.List介绍和使用

SwiftUI 的 List 组件用于展示可滚动的内容集合&#xff0c;支持静态或动态数据、交互操作&#xff08;如点击、滑动删除&#xff09;、分组、自定义样式等。以下是其详细介绍及使用方法&#xff1a; 一、基本用法 1. 静态列表 直接声明固定内容&#xff1a; struct Content…...

Android Kotlin ViewModel 错误处理:最佳 Toast 提示方案详解

在 Android Kotlin 的 ViewModel 中显示 Toast 提示需要特殊处理&#xff0c;因为 ViewModel 不应该直接持有 Context&#xff08;避免内存泄漏&#xff09;&#xff0c;且 UI 操作&#xff08;如 Toast&#xff09;必须在主线程执行。以下是几种标准解决方案&#xff1a; 方案…...

Vue 集成 wangEditor5 公式编辑器的实现步骤‌

Vue 集成 wangEditor5 公式编辑器的实现步骤‌ 1. 安装公式依赖库‌2. 配置公式编辑器插件‌3. 启用工具栏公式按钮‌4. 组件模板与事件绑定‌功能验证与调试‌注意事项‌版本兼容性‌&#xff1a; 1. 安装公式依赖库‌ 安装 KaTeX 或 kityformula‌&#xff1a;根据项目需求选…...

go语言八股文(五)

1.go的局部变量是分配在栈上还是在堆上 在Go语言中&#xff0c;局部变量的内存分配&#xff08;栈或堆&#xff09;由编译器基于逃逸分析&#xff08;escape analysis&#xff09;来决定。以下是总结和具体示例&#xff1a; 栈上分配 当局部变量的生命周期严格限定在函数作用…...

C++ 解决一个简单的图论问题 —— 最小生成树(以 Prim 算法为例)

使用 C 解决一个简单的图论问题 —— 最小生成树&#xff08;以 Prim 算法为例&#xff09;&#xff0c;并且使用 Graphviz 库来生成结果图。 在图论中&#xff0c;“边权之和最小” 是最小生成树&#xff08;MST&#xff09;的核心目标&#xff0c;其含义和背景可以从以下几个…...

OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介

OpenCV计算机视觉实战&#xff08;2&#xff09;——环境搭建与OpenCV简介 0. 前言1. OpenCV 安装与配置1.1 安装 Python-OpenCV1.2 配置开发环境 2. OpenCV 基础2.1 图像读取与显示2.2 图像保存 3. 摄像头实时捕获小结系列链接 0. 前言 OpenCV (Open Source Computer Vision …...

pgrep和pkill命令详解

pgrep 与 pkill 命令详解‌ ‌一、基础功能‌ 命令作用核心机制pgrep根据条件查找进程ID (PID)通过进程名、用户、终端等属性筛选进程&#xff0c;输出匹配的PID列表pkill根据条件终止进程向符合条件的进程发送信号&#xff08;默认发送SIGTERM&#xff0c;可指定其他信号&am…...

Python----卷积神经网络(卷积为什么能识别图像)

一、卷积的概念 卷积是一种数学运算&#xff0c;通常用于信号处理和图像分析。在卷积神经网络中&#xff0c;卷积操作用于提取输入数据&#xff08;如图像&#xff09;中的特征。通过将输入数据与卷积核&#xff08;滤波器&#xff09;进行卷积运算&#xff0c;CNN能够识别图像…...

web3.js 和 ethers.js 的核心区别

1. 核心设计理念 ---------web3.jsethers.js开发背景以太坊基金会官方维护独立开发者创建&#xff0c;社区驱动架构风格集中式对象 (web3 为核心)模块化设计&#xff08;分离 Wallet/Provider/Contract&#xff09;包体积较大&#xff08;1MB&#xff09;更轻量&#xff08;压…...

Atcoder Help 有关Atcoder 的介绍-1 涨分规则

AtCoder 的 Rating 计算系统基于改进的 Elo 算法&#xff0c;主要包含以下核心机制&#xff1a; 一、基础计算公式 Rating 是「表现分(Performance)」的加权平均值减去衰减函数 f ( n ) f(n) f(n)&#xff0c;其中&#xff1a; 新用户初始 f ( 1 ) 1200 f(1)1200 f(1)120…...

Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)

文章目录 1. 项目准备1.1 创建新项目1.2 添加必要依赖 2. 数据库设计3. 实现数据库3.1 创建实体类 (Entity)3.2 创建数据访问对象 (DAO)3.3 创建数据库类 4. 创建 Repository5. 创建 ViewModel6. 实现 UI 层6.1 创建笔记列表 Activityactivity_notes_list.xmlNotesListActivity…...