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

C++ libfmt 实战: 高效便捷的格式化库

libfmt 是一个现代化的 C++格式化库{fmt}, 具有以下关键特性:

  1. 安全性: 受 Python 格式化功能启发, {fmt}printf系列函数提供安全替代方案. 格式字符串错误在编译时就能被检测出来, 并且通过自动内存管理避免缓冲区溢出错误.
  2. 可扩展性: 默认支持格式化大多数标准类型, 包括容器, 日期和时间等. 例如, 能以类似 JSON 的格式打印std::vector. 同时, 用户也能让自定义类型支持格式化, 并进行编译时检查.
  3. 高性能: 在数值格式化方面, {fmt}iostreamssprintf快很多, 速度提升范围从百分之几十到 20 - 30 倍不等. 它尽量减少动态内存分配, 还能将格式字符串编译为优化代码.
  4. Unicode 支持: 在主流操作系统上, {fmt}通过 UTF-8char字符串提供可移植的 Unicode 支持. 默认情况下与区域设置无关, 但也可选择本地化格式化, 解决了标准库在这方面的一些问题.
  5. 编译速度快: 该库大量使用类型擦除技术来加快编译速度. fmt/base.h提供的 API 子集, 包含极少的依赖, 却足以替代所有*printf的使用场景. 使用{fmt}的代码编译速度通常比等效的iostreams代码快几倍, 虽然printf编译速度更快, 但差距正在缩小.
  6. 二进制体积小: 类型擦除技术还能防止模板膨胀, 使得每次调用生成的二进制代码更紧凑.
  7. 可移植性强: {fmt}代码库独立且小巧, 核心仅由三个头文件组成, 无外部依赖.

本文将介绍libfmt的安装以及使用教程. 让读者一文了解其功能.

安装教程

  1. 通过 vcpkg 安装. 如果对 vcpkg 不熟悉, 可以参考我的博客: Vcpkg 使用全攻略: 支持 VS Code, Visual Studio 和 CLion

    vcpkg install fmt
    

    接着在CMakeLists.txt中使用:

    find_package(fmt CONFIG REQUIRED)
    target_link_libraries(main.exe PRIVATE fmt::fmt)
    
  2. 通过 CMake FetchContent 方法. 如果您对 CMake 不是很熟悉, 可以参考我的博客: CMake 入门教程: 从基础到实践

    include(FetchContent)FetchContent_Declare(
    fmt
    GIT_REPOSITORY https://github.com/fmtlib/fmt
    GIT_TAG        e69e5f977d458f2650bb346dadf2ad30c5320281) # 10.2.1
    FetchContent_MakeAvailable(fmt)target_link_libraries(<your-target> fmt::fmt)
    
  3. 嵌入使用(Embed). 将libfmt仓库加入到自己的工程, 作为一个组件使用.

    1. 先克隆仓库到本地
    git clone --depth 1 https://github.com/fmtlib/fmt.git
    
    1. CMakeLists.txt中使用:
    add_subdirectory(fmt) # 加到当前的项目中
    target_link_libraries(<your-target> fmt::fmt)
    

使用教程

格式化方式

  1. 基础样例

    fmt 库采用{}做占位符. 与 Python 的格式化方式很接近.

    fmt::println("Hello {} from year {}", "World", 2025);
    // 输出: Hello World from year 2025
    
  2. 指定参数位置

    fmt::println("{0}+{0}={1}", 1, 2);              // 输出: 1+1=2
    fmt::println("{0}{1}{0} {1}{0}{1}", 'a', 'b');  // 输出: aba bab
    
  3. 整数格式化

    // 数用不同的基数表示整数, 类似printf中的 %d, %o
    fmt::println("decimal: {0:d}; hex: {0:x};  oct: {0:o}; binary: {0:b}", 42);
    // 输出: decimal: 42; hex: 2a;  oct: 52; binary: 101010// with 0x or 0 or 0b as prefix:
    fmt::println("decimal: {0:d}; hex: {0:#x};  oct: {0:#o}; binary: {0:#b}", 42);
    // 输出: decimal: 42; hex: 0x2a;  oct: 052; binary: 0b101010// 指定宽度
    fmt::println("{:#06x}", 0);  // 输出: 0x0000
    
  4. 浮点数格式化

    fmt::println("{:.{}f}", 3.14, 1);  // 输出: 3.1// Replacing % +f, % -f, and % f and specifying a sign :
    fmt::println("{:+f}; {:+f}", 3.14, -3.14);  // 输出: +3.140000; -3.140000// show a space for positive numbers
    fmt::println("{: f}; {: f}", 3.14, -3.14);  // 输出: " 3.140000; -3.140000"// show only the minus -- same as '{:f}; {:f}'
    fmt::println("{:-f}; {:-f}", 3.14, -3.14);  // 输出: 3.140000; -3.140000
    
  5. 对齐和宽度

    // 左对齐
    fmt::println("{:<30}", "left aligned");
    // 输出: "left aligned                  "// 右对齐
    fmt::println("{:>30}", "right aligned");
    // 输出: "                 right aligned"// 居中对其, 空格填充
    fmt::println("{:^30}", "centered");
    // 输出: "           centered           "// 居中对其, 使用'*'字符对齐
    fmt::println("{:*^30}", "centered");  // 使用 '*' 作为填充字符
    // 输出: "***********centered***********"// 动态宽度
    int width = 30;
    fmt::println("{:*^{}}", "centered", width);
    // 输出: "***********centered***********"
    
  6. 时间格式化

    std::tm datetime = {};
    datetime.tm_year = 2025 - 1900;            // 年份从 1900 开始计数
    datetime.tm_mon = 1 - 1;                   // 月份从 0 开始计数
    datetime.tm_mday = 30;                     // 日期
    datetime.tm_hour = 12;                     // 小时
    datetime.tm_min = 12;                      // 分钟
    datetime.tm_sec = 30;                      // 秒
    fmt::println("time: {:%H:%M}", datetime);  // 输出: time: 12:12
    fmt::println("datetime: {:%Y-%m-%d %H:%M:%S}", datetime);
    // 输出: datetime: 2025-01-30 12:12:30
    

    关于时间格式请参考: fmt syntax

  7. 画 Unicode 字符

    fmt::print("┌{0:─^{2}}┐\n""│{1: ^{2}}│\n""└{0:─^{2}}┘\n","", "Hello, world!", 20);
    

    输出:

    ┌────────────────────┐
    │   Hello, world!    │
    └────────────────────┘
    

本节的完整代码请参考basic.cpp

打印容器

  1. 打印标准容器

    // vector
    std::vector<int> vec = {1, 2, 3, 4, 5};
    fmt::println("Vector: {}", vec);  // 输出: Vector: [1, 2, 3, 4, 5]// array
    std::array<std::string, 3> arr = {"C++", "Python", "Rust"};
    fmt::println("Array: {}", arr);  // 输出: Array: [C++, Python, Rust]// map
    std::map<std::string, int> map = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 20}};
    fmt::println("Map: {}", map);
    // 输出: Map: {"Alice": 25, "Bob": 30, "Charlie": 20}// set
    std::set<int> set = {3, 1, 4, 1, 5};
    fmt::println("Set: {}", set);  // 输出: Set: [1, 3, 4, 5]
    
  2. 嵌套容器

    std::vector<std::vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    fmt::println("Matrix: {}", matrix);
    // 输出: Matrix: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    
  3. 格式化组合

    std::vector<double> numbers = {3.14159, 2.71828, 1.41421};
    fmt::println("Numbers: {::.2f}", numbers);  // Numbers: [3.14, 2.72, 1.41]fmt::println("Vector: {::#x}", vec);  // Vector: [0x1, 0x2, 0x3, 0x4, 0x5]
    

本节完整代码请参考: container.cpp


对传统代码的替代

性能对比

下图是官网给出的速度对比, 数值越小表示耗时越少.

speed compare

替换传统 API

// printf
// 用fmt::printf替换
fmt::fprintf(stderr, "Hello from %s!\n", "fmt::printf");
// 输出: Hello from fmt::printf!// 改写
auto s = fmt::format("Hello from {}!", "fmt::format");
fmt::println(s);  // 输出: Hello from fmt::format!// 与ostream的搭配
fmt::println(std::cerr, "Don't {}!", "panic");  // 输出: Don't panic!// 替代 fstream
auto out = fmt::output_file("greeting.txt");
out.print("Hello {}!", "World");// 替代: ostringstream
auto buffer = fmt::memory_buffer();
fmt::format_to(std::back_inserter(buffer), "width:{};", 480);
fmt::format_to(std::back_inserter(buffer), "height:{};", 360);
fmt::println(buffer.data());  // 输出: width:480;height:360;

本节完整代码请参考: stream.cpp

总结

libfmt作为一个现代的 C++ 格式化库, 其性能强大, 使用方便同时安全性高. 其不少特性已经被引入 C++标准库(容器部分尚未引入). 感兴趣的读者建议下载尝试.

参考链接

  • fmt: A modern formatting library
  • fmt Github 仓库

源码链接

本文示例源码链接

相关文章:

C++ libfmt 实战: 高效便捷的格式化库

libfmt 是一个现代化的 C格式化库{fmt}, 具有以下关键特性: 安全性: 受 Python 格式化功能启发, {fmt}为printf系列函数提供安全替代方案. 格式字符串错误在编译时就能被检测出来, 并且通过自动内存管理避免缓冲区溢出错误.可扩展性: 默认支持格式化大多数标准类型, 包括容器,…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_max_sockets

在 Nginx 的源代码中&#xff0c; ngx_max_sockets 全局变量的声明位于 os/unix/ngx_os.h extern ngx_int_t ngx_max_sockets; 定义在 os/unix/ngx_posix_init.c ngx_int_t ngx_max_sockets; ngx_max_sockets 定义了 Nginx 能够同时使用的最大 Socket 文件描述符数量。它…...

Spring Boot接入Deep Seek的API

1&#xff0c;首先进入deepseek的官网&#xff1a;DeepSeek | 深度求索&#xff0c;单击右上角的API开放平台。 2&#xff0c;单击API keys&#xff0c;创建一个API&#xff0c;创建完成务必复制&#xff01;&#xff01;不然关掉之后会看不看api key&#xff01;&#xff01;&…...

大语言模型实践——基于现有API的二次开发

基于现有的API平台做一些实用的AI小应用。 API服务商&#xff1a;阿里云百炼 云服务器&#xff1a;阿里云&#xff08;2核2GB&#xff09; 部署框架&#xff1a;gradio 调用框架&#xff1a;openai 语言&#xff1a;Python &#xff08;注&#xff1a;若搭建网站或API接口…...

ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

深入探究 Go 语言中的 Fx 框架:依赖注入的强大工具

在软件开发中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是一种重要的设计模式&#xff0c;它可以帮助我们降低代码的耦合度&#xff0c;提高代码的可测试性和可维护性。Go 语言作为一门高效、简洁的编程语言&#xff0c;拥有许多优…...

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤&#xff1a; 利用 DeepSeek 生成 PPT 内容&#xff1a; 访问 DeepSeek 官网&#xff0c;完成注册/登录后进入对话界面。输入指令&#xff0c;例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲&#xff0c;需包…...

【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战

【04】Java若依vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战 项目背景 本项目经费43000元&#xff0c;需求文档如下&#xff0c;工期25天&#xff0c;目前已经过了8天&#xff0c;时间不多了&#x…...

【C++】异常

前言 本篇博客我们来看下C有关异常的处理&#xff0c;了解下异常有关的知识 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;C 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.异常的概念及使用 1.1异…...

Meta AI 最近推出了一款全新的机器学习框架ParetoQ,专门用于大型语言模型的4-bit 以下量化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

金融资产配置

不要放在一个篮子里也不要放在太多篮子里&#xff1a; 尽量放在不相关的行业实现风险对冲 金融资产从风险类别上主要可以分为三类&#xff1a; 进攻型资产、稳定型资产和防守型资产 进攻型资产包括原油、股票、一级市场股权投资等 稳定型资产包括信托、理财、国债等 防守…...

(done) openMP学习 (Day14: 总结)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 新手并行程序员与专家并行程序员之间的区别是专家have a collection…...

音频进阶学习十一——离散傅里叶级数DFS

文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1&#xff09;右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn​)的释义 ∑ n 0 N − 1 e…...

ssm的心得

spring是一个轻量级的ioc&#xff08;控制反转&#xff09;和aop&#xff08;面向切面编程&#xff09;容器框架&#xff0c;它可以管理和配置应用中的各种bean&#xff08;对象&#xff09;&#xff0c;实现bean之间的依赖注入&#xff0c;以及提供事务管理、缓存、测试等功能…...

14vue3实战-----获取用户信息和用户的菜单树信息

14vue3实战-----获取用户信息和用户的菜单树信息 1.获取用户信息1.1封装接口1.2优化 2.获取用户的菜单树信息 1.获取用户信息 1.1封装接口 后端有根据id获取用户信息的接口&#xff0c;前端需要把该接口封装一下: service/login/login.ts&#xff1a; import hyRequest from…...

shell脚本学习笔记

Shell脚本学习笔记 参考资料&#xff1a;https://www.runoob.com/linux/linux-shell-passing-arguments.html 文章目录 Shell脚本学习笔记一、什么是Shell1.1、定义1.2、注释 二、Shell变量2.1、规则2.2、变量类型2.2.1、字符串2.2.2、整数2.2.3、数组2.2.4、环境变量2.2.5、特…...

Java中的线程池及其应用场景有哪些?

Java中的线程池是一种高效的并发编程机制&#xff0c;通过复用线程来管理任务的执行&#xff0c;从而提高资源利用率和系统性能。 本文将详细探讨Java线程池的概念、类型、应用场景以及实际代码示例&#xff0c;帮助读者全面理解线程池的使用方法及其在实际开发中的重要性。 …...

13.6 基于 LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍

LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍 关键词:LangChain 架构优化, 模块解耦, 翻译系统设计模式, 可扩展翻译框架, 多模型管理 1. 原架构痛点分析 问题维度原实现缺陷LangChain 优化方案大模型耦合直接调用 OpenAI API,切换模型需改代码…...

构建基于 SSE 协议通信的 MCP Server 和 Client

在之前的系列教程中&#xff0c;我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio&#xff08;Standard Input/Output&#xff0c;标准输入输出&#xff09;**来进行交互的。客户端通过启动服务器子进程&#xff0c;并利用标准输入&#xff08;stdin&#xff09;和标准输出&a…...

Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践

在现代企业中&#xff0c;管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求&#xff0c;企业越来越倾向于构建本地私有化的知识库系统&#xff0c;这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...

第3章 使用 Vue 脚手架

第3章 使用 Vue 脚手架 3.1 初始化脚手架3.1.1 说明3.1.2. 具体步骤3.1.3 分析脚手架结构1 总结2 细节分析1 配置文件2 src文件1 文件结构分析2 例子 3 public文件4 最终效果 3.2 ref属性3.3 props配置项3.4 mixin混入3.5 插件3.6 scoped样式3.7 Todo-list 案例3.7.1 组件化编码…...

MySQL第五次作业

根据图片内容完成作业 1.建表 &#xff08;1&#xff09;建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...

pikachu[皮卡丘] 靶场全级别通关教程答案 以及 学习方法 如何通过渗透测试靶场挑战「pikachu」来精通Web渗透技巧? 一篇文章搞完这些问题

目录 Pikachu靶场 部署 暴力破解漏洞 学习地址: 靶场练习: 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on Client) token防爆破? XSS跨站脚本攻击 学习地址: 靶场练习&#xff1a; 反射型xss(get) 反射性xss(post) 存储型xss DOM型xss xss盲打 x…...

ai智能DeepSeek 在 Cursor 中的配置与应用实践

DeepSeek 是一款高效的深度搜索引擎&#xff0c;能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中&#xff0c;DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用&#xff0c;帮助开发者理解如何在实际开发…...

登录到docker里

在Docker中登录到容器通常有两种情况&#xff1a; 登录到正在运行的容器内部&#xff1a;如果你想要进入到正在运行的容器内部&#xff0c;可以使用docker exec命令。 登录到容器中并启动一个shell&#xff1a;如果你想要启动一个容器&#xff0c;并在其中启动一个shell&…...

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)

搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...

Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

10.单例模式 (Singleton Pattern)

单例模式的定义 单例模式&#xff08;Singleton Pattern&#xff09; 是一种创建型设计模式&#xff0c;确保一个类在整个程序生命周期中只能有一个实例&#xff0c;并提供一个全局访问点。 特点&#xff1a; 唯一性&#xff1a;保证系统中某个类只能有一个实例。全局访问点…...

Docker 常见问题解决方法

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes常…...

QT-面试

1. C&#xff08;特别是 Qt&#xff09;开发中&#xff0c;内存优化的方法 1. 合理管理对象生命周期&#xff0c;使用智能指针 Qt 提供了 QScopedPointer 和 QSharedPointer 来管理对象生命周期&#xff0c;避免手动 delete 导致的内存泄漏。 2. 减少内存占用 QString、QBy…...

使用java代码操作rabbitMQ收发消息

SpringAMQP 将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也…...

LeetCode 128: 最长连续序列

LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums […...

Shapefile格式文件解析和显示

Java实现GIS SHP文件格式的解析和显示&#xff0c;JDK19下编译&#xff0c;awt图形系统显示。 SHP文件对应的属性存储在DBF格式数据库中&#xff0c;解析见&#xff1a;DBASE DBF数据库文件解析_数据库文件在线解析-CSDN博客 解析SHP文件代码&#xff1a; public static Shap…...

华为昇腾Altas产品查询——常用命令汇总记录

参考链接&#xff1a; 【2024第一期CANN训练营】Altas产品查询CANN软件包版本等信息npu-smi Atlas 中心训练服务器 6.0.0 NPU驱动和固件安装指南 06 Ascend Extension for PyTorch插件软件版本配套表 以下操作适用于查询npu设备的基本信息。 #查询所有设备的基本信息 npu-smi…...

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技&#xff1a;消费电子行业售后服务实现数字化转型&#xff0c;重塑客户服务体系 在当今这个科技日新月异的时代&#xff0c;企业之间的竞争早已超越了单纯的产品质量比拼&#xff0c;**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…...

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”&#xff08;split-apply-combine&#xff09;策略。此策略是指将一个问题分割成更容易操作的部分&#xff0c;再对每一部分进行独立的操作&#xff0c;最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…...

开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。

一、明确游戏定位与核心玩法 游戏类型 MOBA&#xff08;Multiplayer Online Battle Arena&#xff09;&#xff1a;强调团队合作、策略性和即时战斗。确定游戏模式&#xff08;如5v5、3v3等&#xff09;和地图设计。 核心玩法 角色设计&#xff1a;英雄技能、属性、成长曲线。…...

harmonyOS生命周期详述

harmonyOS的生命周期分为app(应用)的生命周期和页面的生命周期函数两部分 应用的生命周期-app应用 在app.js中写逻辑,具体有哪些生命周期函数呢,请看下图: onCreated()、onShow()、onHide()、onDestroy()这五部分 页面及组件生命周期 着重说下onShow和onHide,分别代表是不是…...

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;安装 Ollama 安装 Ollama&#xff1a; 使用以下命令安装 Ollama&#xff1a; curl -sSfL https://ollama.com/download.…...

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言&#xff1a;在开发过程中&#xff0c;几乎踩便了所有大坑小坑总结出的文章&#xff0c;我是把坑踩满了&#xff0c;帮助更过小白快速上手&#xff0c;如有错误之处&#xff0c;还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能&#xff1a; 模组启动模…...

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…...

TCP队头阻塞问题以及QUIC解决方案

TCP队头阻塞(Head-of-Line Blocking)问题 问题描述 TCP是面向字节流的可靠传输协议,要求数据按严格顺序到达接收端。若某个数据包在传输过程中丢失、延迟或乱序,会导致以下问题: 后续数据被阻塞:接收端必须等待丢失/延迟的包重传并正确接收后,才能将后续已到达的数据交…...

idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…...

如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例

在当今数据驱动的商业环境中&#xff0c;获取商品销量数据对于市场分析、竞品研究和商业决策至关重要。然而&#xff0c;像eBay这样的大型电商平台通常会部署多种反爬虫机制来保护其数据。本文将详细介绍如何利用Python编写爬虫程序&#xff0c;获取eBay商品的销量详情&#xf…...

激活函数篇 03 —— ReLU、LeakyReLU、RandomizedLeakkyReLU、PReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 整流线性单位函数&#xff08;Rectified Linear Unit, ReLU&#xff09;&#xff0c;又称修正线性单元&a…...

算法基础之八大排序

文章目录 概要1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 希尔排序&#xff08;Shell Sort&#xff09;5. 归并排序&#xff08;Merge Sort&#xff09;6. 快速排…...

通达OA /mysql/index.php 未授权访问漏洞

通达OA /mysql/index.php 未授权访问漏洞 漏洞描述 通达OA 未授权访问phpmyadmin漏洞&#xff0c;攻击者无需帐号密码可直接访问phpmyadmin&#xff0c;造成数据库泄漏。攻击者可操作数据库执行sql语句&#xff0c;执行恶意操作&#xff0c;进行一步攻击。 威胁等级: 高危 …...

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...

C++类和对象

目录 一、类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 二、实例化 2.1、实例化概念 2.2、对象大小 三、this指针 四、类的默认成员 4.1、构造函数 4.2、析构函数 4.3、拷贝构造 4.4、赋值运算符重载 4.4.1、运算符重载 4.4.2、赋值运算符重载 4.5、日…...

AI知识库和全文检索的区别

1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统&#xff0c;能够理解、推理和生成信息。它的核心作用包括&#xff1a; 1.1 语义理解 自然语言处理&#xff08;NLP&#xff09;&#xff1a;AI知识库能够理解用户查询的语义&#xff0c;而不仅仅是关键词匹配。 …...