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

fmt:C++ 格式化库

在这里插入图片描述

fmt 是一个现代化、快速且安全的 C++ 格式化库,专注于高效地格式化文本。它提供了类似 Python 的 format 功能,但具有更高的性能和类型安全特性。fmt 库在处理字符串格式化、日志输出以及构建用户友好的输出时尤为强大。自从 C++20 标准引入 std::format 后,fmt 作为其原型库已经广泛应用于各种 C++ 项目中。

在这里插入图片描述

华丽的分割线

⭕️宇宙起点

    • 💯 主要特点
    • 💯 安装和集成
      • 使用 vcpkg 安装
      • 使用 CMake 直接集成
      • 使用 Conan 安装
    • 💯 fmt 库的基本用法
      • 基本格式化
      • 带格式的输出
      • 日志格式化
    • 💯 高级功能
      • 动态格式化
      • 自定义类型格式化
    • 💯 性能优势
    • 💯 与 `std::format` 的关系
    • 📥 下载地址
    • 💬 结语
    • 📒 参考文献


标题1

💯 主要特点

  • 类型安全:fmt 使用 C++ 的模板机制,确保在编译时进行类型检查,防止格式错误。
  • 高性能:fmt 经过精心优化,能够比传统的 sprintf 函数更高效地进行字符串格式化操作。
  • 简洁的 API:fmt 提供了简单且直观的 API,降低了格式化操作的复杂度。
  • 丰富的格式支持:支持各种数据类型和自定义格式化功能,满足复杂的格式化需求。
  • 与 C++ 标准兼容:fmt 库作为 C++20 std::format 的基础,与现代 C++ 完美结合。

标题2

💯 安装和集成

fmt 可以通过多种方式安装,并轻松集成到您的项目中。

使用 vcpkg 安装

vcpkg 是一种流行的包管理工具,可以轻松安装 fmt:

vcpkg install fmt

然后在 CMake 中使用:

find_package(fmt REQUIRED)
target_link_libraries(your_project_name PRIVATE fmt::fmt)

使用 CMake 直接集成

如果您不使用包管理工具,也可以通过将 fmt 源码直接集成到项目中:

  1. 下载 fmt 源码。
  2. 在 CMake 文件中包含 fmt:
add_subdirectory(fmt)
target_link_libraries(your_project_name PRIVATE fmt::fmt)

使用 Conan 安装

Conan 是另一个流行的 C++ 包管理工具:

conan install fmt/11.0.0@

这可以自动下载并配置 fmt 以供项目使用。


标题3

💯 fmt 库的基本用法

fmt 的核心功能是格式化字符串。与传统的 printf 不同,它更具可读性并支持现代 C++ 的类型安全机制。以下是 fmt 库的一些常见用法。

基本格式化

printf 类似,fmt 提供了格式化功能,但语法更加简洁:

#include <fmt/core.h>
#include <iostream>int main() {std::string name = "John";int age = 25;std::string result = fmt::format("姓名: {}, 年龄: {}", name, age);std::cout << result << std::endl;return 0;
}

在上述代码中,fmt::format 使用 {} 作为占位符,与 Python 的 str.format 类似,并且能够自动推断数据类型。

带格式的输出

fmt 允许为每个占位符指定格式选项,以下是格式化数字的示例:

#include <fmt/core.h>
#include <iostream>int main() {double pi = 3.14159;std::string result = fmt::format("圆周率: {:.2f}", pi);  // 保留两位小数std::cout << result << std::endl;return 0;
}

{:.2f} 的含义是将浮点数格式化为两位小数,类似于 printf 中的 %.2f

日志格式化

fmt 也可以用来构建高效的日志系统。相比于传统的日志库,fmt 具有更好的性能表现:

#include <fmt/core.h>
#include <iostream>void log_info(const std::string &message) {std::cout << fmt::format("[INFO]: {}", message) << std::endl;
}int main() {log_info("应用程序启动成功");return 0;
}

这种日志输出方式不仅直观,还可以通过 fmt::format 的丰富功能实现复杂的日志格式。


标题4

💯 高级功能

除了基础的字符串格式化,fmt 还提供了许多高级功能,适合更加复杂的应用场景。

动态格式化

fmt 支持根据运行时条件动态构建格式字符串,这使得它在处理不确定格式时非常灵活:

#include <fmt/core.h>
#include <iostream>int main() {std::string fmt_str = "{} is {}";std::cout << fmt::format(fmt_str, "The answer", 42) << std::endl;return 0;
}

动态格式字符串可以根据输入的不同情况动态改变,灵活性非常高。

自定义类型格式化

fmt 允许用户为自定义类型定义格式化规则,以下是一个为 Point 类型自定义格式化输出的示例:

#include <fmt/core.h>
#include <iostream>struct Point {int x, y;
};// 定义 Point 类型的格式化规则
template <>
struct fmt::formatter<Point> {constexpr auto parse(fmt::format_parse_context& ctx) {return ctx.begin();}template <typename FormatContext>auto format(const Point& p, FormatContext& ctx) {return fmt::format_to(ctx.out(), "({}, {})", p.x, p.y);}
};int main() {Point p = {10, 20};std::cout << fmt::format("Point: {}", p) << std::endl;return 0;
}

通过自定义格式化器,fmt 可以灵活处理几乎任何类型的数据,并根据需求输出不同格式。


标题5

💯 性能优势

与传统的 printfsprintf 相比,fmt 的性能大幅提升,特别是在处理大量格式化操作时。它通过优化内部内存管理和避免不必要的类型转换,减少了运行时的性能损耗。

根据官方基准测试,fmt 在多数情况下都比标准的 C++ iostream 和 C 风格的 sprintf 更快。以下是官方提供的一些基准数据:

操作类型fmt 性能提升传统方法
字符串格式化2 倍sprintf
自定义类型格式化3 倍手动实现
日志输出约 30% 提升iostream

通过使用 fmt,开发者不仅能够编写更加清晰、可读的代码,同时还能够在高性能应用中减少性能瓶颈。


标题6

💯 与 std::format 的关系

fmt 库的 API 与 C++20 引入的 std::format 非常相似,事实上,std::format 是基于 fmt 库的实现原型。随着 C++20 的普及,std::format 也将成为标准库的一部分。但是,fmt 提供了比 std::format 更多的扩展功能,如日志功能、动态格式化等,因此即便在 C++20 项目中,fmt 依然是一个非常实用的选择。


标题7

📥 下载地址


fmt 最新版 下载地址


标题8

💬 结语

fmt 是一个功能强大且灵活的 C++ 字符串格式化库,适用于各种需要格式化文本的场景。无论是在简单的字符串拼接、复杂的数据输出,还是自定义类型的格式化方面,fmt 都表现出色。其简洁的 API 和高性能特性,使得 fmt 在现代 C++ 开发中占据了重要位置。

如果你正在寻找一个比 printf 更高效、安全,且更易于使用的 C++ 格式化工具,fmt 将是一个理想的选择。通过其丰富的功能和广泛的应用场景,fmt 能够大幅提升代码的可维护性和运行效率。

📒 参考文献

  • fmt 官网
  • fmt GitHub仓库

TheEnd


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

相关文章:

fmt:C++ 格式化库

fmt 是一个现代化、快速且安全的 C 格式化库&#xff0c;专注于高效地格式化文本。它提供了类似 Python 的 format 功能&#xff0c;但具有更高的性能和类型安全特性。fmt 库在处理字符串格式化、日志输出以及构建用户友好的输出时尤为强大。自从 C20 标准引入 std::format 后&…...

RabbitMQ MQ的可靠性及消费者的可靠性

1.MQ可靠性&#xff1a; 如何保证消息的可靠性&#xff1a; (1).通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘&#xff0c;MQ重起消息依然存在。 (2).3.6.0版本开始&#xff0c;RabbitMQ引入了惰性队列模式&#xff0c;这种模式下&am…...

使用 Nexus 代理 Docker Hub 的配置指南

在本篇文章中&#xff0c;我们将详细介绍如何配置 Nexus 以代理 Docker Hub&#xff0c;从而实现更高效的镜像管理。以下步骤涵盖了从 Nexus 的安装到 Docker 客户端的配置。 1. 配置 Nexus 1.1 登录 Nexus 打开浏览器&#xff0c;访问 Nexus 的 URL&#xff08;例如 http:/…...

笔记整理—linux进程部分(4)进程状态与守护进程

进程的几种重要状态&#xff0c;就绪态&#xff1b;运行态&#xff1b;僵尸态&#xff1b;等待态&#xff08;浅度睡眠、深度睡眠&#xff09;&#xff1b;停止态。 就单核CPU而言&#xff0c;在同一时间只能运行一个进程&#xff0c;但实际上要运行的进程不止一个&#xff0c;…...

# VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统?

VirtualBox中安装的CentOS 6.5网络设置为NAT模式时&#xff0c;怎么使用SecureCRT连接CentOS6.5系统&#xff1f; 一、查询 【VirtualBox Host-Only Network】虚拟网卡的网络配置 IP。 1、按键盘上WIN R 组合键&#xff0c;打开【运行】&#xff0c;输入【 ncpa.cpl 】&…...

7-1.Android SQLite 之 SQLiteDatabase 简单编码模板(SQLiteDatabase 使用、SQL 语句编写)

一、SQLiteDatabase SQLite 是一种轻量级的数据库引擎&#xff0c;它非常适合在移动设备&#xff08;例如&#xff0c;Android&#xff09;上使用 SQLiteDatabase 允许应用程序与 SQLite 数据库进行交互&#xff0c;它提供了增删改查等一系列方法 二、SQLiteDatabase 简单编码…...

灰度图像重心(质心)求取算法

1、图像的重心坐标计算 假设我们有一个二维图像,其中 (x, y) 表示图像中每个像素的坐标。I(x, y) 表示图像在 (x, y) 处的亮度(或像素值),通常是灰度值。 图像的重心坐标 (X, Y) 可以通过以下公式计算: X = Σ [x * I(x, y)] / Σ I(x, y) Y = Σ [y * I(x, y)] / Σ I(…...

k8s 1.28.2 集群部署 ingress 1.11.1 包含 admission-webhook

文章目录 [toc]证书创建部署 ingress-controlleringress 验证创建测试 nginx pod创建错误的 ingress 配置创建正确的 ingress 配置 ingress 官方 yaml 文件&#xff1a;deploy.yaml基于官方 yaml 文件做了一些修改 官方的 svc 是 ClusterIP 和 LoadBalancer&#xff0c;我这边把…...

pom web 自动化测试框架分享

这是初版的 pom web 测试框架&#xff0c;目录如下同时部分代码也放在下面&#xff0c;详细代码可前往 github 查看&#xff0c;欢迎大家给出宝贵意见。 |--base | base_page.py&#xff08;封装方法&#xff09; | |--config | allure_config.py&#xff08;测试报告配…...

一些以前使用的linux及shell命令,gnuplot脚本

tar tar -cvzf xxx.tar.gz * -c&#xff0c;--create 创建新的tar文件 -v&#xff0c;--verbose 列出每一步处理涉及的文件的信息&#xff0c;只用一个“v”时&#xff0c;仅列出文件名 使用两个“v”时&#xff0c;列出权限、所有者、大小、时间、文件名等信息 -z&#xff0c…...

Django一分钟:DRF模型序列化器处理关联关系的示例与注意事项

DRF的ModelSerializer序列化器与Django的Model模型紧密映射&#xff0c;本文将通过简单的示例介绍几种处理关联关系的方法。 1. 创建模型和初始数据 创建模型 from django.db import modelsclass Product(models.Model):product_name models.CharField(max_length255)quant…...

Python爬虫selenium框架基本使用

一、安装导入 使用包管理器安装 pip3 install selenium 二、WebDriver工具 要使用这个工具我们需要保证安装了一个浏览器的驱动器。 Python的WebDriver是一个用于自动化Web浏览器操作的工具&#xff0c;它属于Selenium的一部分&#xff0c;特别是Selenium 2.0及以后版本中…...

sql 时间交集

任务&#xff08;取时间交集&#xff09; 前端输入开始时间和结束时间&#xff0c;通过sql筛选出活动开始时间和活动结束时间再开时时间和结束时间有交集的活动 想法&#xff1a; 前后一段时间内遇到了类似取交集的&#xff0c;从网上找到了两种写法&#xff0c;再结合GPT等…...

【深度学习】05-Rnn循环神经网络-01- 自然语言处理概述/词嵌入层/循环网络/文本生成案例精讲

循环神经网络&#xff08;RNN&#xff09;主要用于自然语言处理的。 循环神经网络&#xff08;RNN&#xff09;、卷积神经网络&#xff08;CNN&#xff09;和全连接神经网络&#xff08;FCN&#xff09;是三种常见的神经网络类型&#xff0c;各自擅长处理不同类型的数据。下面…...

基于JAVA+SpringBoot+Vue的电商平台的设计与实现

基于JAVASpringBootVue的电商平台的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345…...

CSS盒模型-怪异盒模型笔记-思维导图-案例等

文章目录 一、盒模型&#xff08;重点&#xff09;二、怪异盒模型三、块级元素和行内元素区别汇总四、块级元素和行内元素的转换(显示方式)||元素的显示和隐藏五、思维导图六、笔记资料 一、盒模型&#xff08;重点&#xff09; 所有HTML元素可以看作盒子。 CSS盒模型本质上是…...

thinkphp6开发的通用网站系统源码

thinkphp6开发的通用网站系统源码。 基于ThinkPHP6框架开发的通用后台权限管理系统&#xff0c;底层采用国内最流行的ThinkPHP6框架&#xff0c; 支持内容管理、文章管理、用户管理、权限管理、角色管理等功能。 代码下载百度网盘...

Junit 5 - 理解Mockito,提高UT 覆盖率

前言 当我是1个3年初级程序员时&#xff0c; 我被面试者问到1个问题&#xff1a; 如何保证你的开发任务交付质量 当我是1个7年开发组长时&#xff0c; 我被面试者问到另1个问题&#xff1a;如何保证你的团队的代码质量&#xff0c; 减少rework。 又若干年后&#xff0c; 我才…...

微服务sentinel解析部署使用全流程

sentinel源码地址&#xff1a; 介绍 alibaba/Sentinel Wiki GitHub sentinel官方文档&#xff1a; https://sentinelguard.io/zh-cn/docs/introduction.html Sprong Cloud alibaba Sentinel文档【小例子】 : Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 目录 1、…...

YOLO11震撼发布!

非常高兴地向大家介绍 Ultralytics YOLO系列的新模型&#xff1a; YOLO11&#xff01; YOLO11 在以往 YOLO 模型基础上带来了一系列强大的功能和优化&#xff0c;使其速度更快、更准确、用途更广泛。主要改进包括 增强了特征提取功能&#xff0c;从而可以更精确地捕捉细节以更…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...