fmt:C++ 格式化库

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


⭕️宇宙起点
- 💯 主要特点
- 💯 安装和集成
- 使用 vcpkg 安装
- 使用 CMake 直接集成
- 使用 Conan 安装
- 💯 fmt 库的基本用法
- 基本格式化
- 带格式的输出
- 日志格式化
- 💯 高级功能
- 动态格式化
- 自定义类型格式化
- 💯 性能优势
- 💯 与 `std::format` 的关系
- 📥 下载地址
- 💬 结语
- 📒 参考文献
![]()
💯 主要特点
- 类型安全:fmt 使用 C++ 的模板机制,确保在编译时进行类型检查,防止格式错误。
- 高性能:fmt 经过精心优化,能够比传统的
sprintf函数更高效地进行字符串格式化操作。 - 简洁的 API:fmt 提供了简单且直观的 API,降低了格式化操作的复杂度。
- 丰富的格式支持:支持各种数据类型和自定义格式化功能,满足复杂的格式化需求。
- 与 C++ 标准兼容:fmt 库作为 C++20
std::format的基础,与现代 C++ 完美结合。
![]()
💯 安装和集成
fmt 可以通过多种方式安装,并轻松集成到您的项目中。
使用 vcpkg 安装
vcpkg 是一种流行的包管理工具,可以轻松安装 fmt:
vcpkg install fmt
然后在 CMake 中使用:
find_package(fmt REQUIRED)
target_link_libraries(your_project_name PRIVATE fmt::fmt)
使用 CMake 直接集成
如果您不使用包管理工具,也可以通过将 fmt 源码直接集成到项目中:
- 下载 fmt 源码。
- 在 CMake 文件中包含 fmt:
add_subdirectory(fmt)
target_link_libraries(your_project_name PRIVATE fmt::fmt)
使用 Conan 安装
Conan 是另一个流行的 C++ 包管理工具:
conan install fmt/11.0.0@
这可以自动下载并配置 fmt 以供项目使用。
![]()
💯 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 的丰富功能实现复杂的日志格式。
![]()
💯 高级功能
除了基础的字符串格式化,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 可以灵活处理几乎任何类型的数据,并根据需求输出不同格式。
![]()
💯 性能优势
与传统的 printf 和 sprintf 相比,fmt 的性能大幅提升,特别是在处理大量格式化操作时。它通过优化内部内存管理和避免不必要的类型转换,减少了运行时的性能损耗。
根据官方基准测试,fmt 在多数情况下都比标准的 C++ iostream 和 C 风格的 sprintf 更快。以下是官方提供的一些基准数据:
| 操作类型 | fmt 性能提升 | 传统方法 |
|---|---|---|
| 字符串格式化 | 2 倍 | sprintf |
| 自定义类型格式化 | 3 倍 | 手动实现 |
| 日志输出 | 约 30% 提升 | iostream |
通过使用 fmt,开发者不仅能够编写更加清晰、可读的代码,同时还能够在高性能应用中减少性能瓶颈。
![]()
💯 与 std::format 的关系
fmt 库的 API 与 C++20 引入的 std::format 非常相似,事实上,std::format 是基于 fmt 库的实现原型。随着 C++20 的普及,std::format 也将成为标准库的一部分。但是,fmt 提供了比 std::format 更多的扩展功能,如日志功能、动态格式化等,因此即便在 C++20 项目中,fmt 依然是一个非常实用的选择。
![]()
📥 下载地址
fmt 最新版 下载地址
![]()
💬 结语
fmt 是一个功能强大且灵活的 C++ 字符串格式化库,适用于各种需要格式化文本的场景。无论是在简单的字符串拼接、复杂的数据输出,还是自定义类型的格式化方面,fmt 都表现出色。其简洁的 API 和高性能特性,使得 fmt 在现代 C++ 开发中占据了重要位置。
如果你正在寻找一个比 printf 更高效、安全,且更易于使用的 C++ 格式化工具,fmt 将是一个理想的选择。通过其丰富的功能和广泛的应用场景,fmt 能够大幅提升代码的可维护性和运行效率。
📒 参考文献
- fmt 官网
- fmt GitHub仓库



相关文章:
fmt:C++ 格式化库
fmt 是一个现代化、快速且安全的 C 格式化库,专注于高效地格式化文本。它提供了类似 Python 的 format 功能,但具有更高的性能和类型安全特性。fmt 库在处理字符串格式化、日志输出以及构建用户友好的输出时尤为强大。自从 C20 标准引入 std::format 后&…...
RabbitMQ MQ的可靠性及消费者的可靠性
1.MQ可靠性: 如何保证消息的可靠性: (1).通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘,MQ重起消息依然存在。 (2).3.6.0版本开始,RabbitMQ引入了惰性队列模式,这种模式下&am…...
使用 Nexus 代理 Docker Hub 的配置指南
在本篇文章中,我们将详细介绍如何配置 Nexus 以代理 Docker Hub,从而实现更高效的镜像管理。以下步骤涵盖了从 Nexus 的安装到 Docker 客户端的配置。 1. 配置 Nexus 1.1 登录 Nexus 打开浏览器,访问 Nexus 的 URL(例如 http:/…...
笔记整理—linux进程部分(4)进程状态与守护进程
进程的几种重要状态,就绪态;运行态;僵尸态;等待态(浅度睡眠、深度睡眠);停止态。 就单核CPU而言,在同一时间只能运行一个进程,但实际上要运行的进程不止一个,…...
# VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统?
VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统? 一、查询 【VirtualBox Host-Only Network】虚拟网卡的网络配置 IP。 1、按键盘上WIN R 组合键,打开【运行】,输入【 ncpa.cpl 】&…...
7-1.Android SQLite 之 SQLiteDatabase 简单编码模板(SQLiteDatabase 使用、SQL 语句编写)
一、SQLiteDatabase SQLite 是一种轻量级的数据库引擎,它非常适合在移动设备(例如,Android)上使用 SQLiteDatabase 允许应用程序与 SQLite 数据库进行交互,它提供了增删改查等一系列方法 二、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 文件:deploy.yaml基于官方 yaml 文件做了一些修改 官方的 svc 是 ClusterIP 和 LoadBalancer,我这边把…...
pom web 自动化测试框架分享
这是初版的 pom web 测试框架,目录如下同时部分代码也放在下面,详细代码可前往 github 查看,欢迎大家给出宝贵意见。 |--base | base_page.py(封装方法) | |--config | allure_config.py(测试报告配…...
一些以前使用的linux及shell命令,gnuplot脚本
tar tar -cvzf xxx.tar.gz * -c,--create 创建新的tar文件 -v,--verbose 列出每一步处理涉及的文件的信息,只用一个“v”时,仅列出文件名 使用两个“v”时,列出权限、所有者、大小、时间、文件名等信息 -z,…...
Django一分钟:DRF模型序列化器处理关联关系的示例与注意事项
DRF的ModelSerializer序列化器与Django的Model模型紧密映射,本文将通过简单的示例介绍几种处理关联关系的方法。 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浏览器操作的工具,它属于Selenium的一部分,特别是Selenium 2.0及以后版本中…...
sql 时间交集
任务(取时间交集) 前端输入开始时间和结束时间,通过sql筛选出活动开始时间和活动结束时间再开时时间和结束时间有交集的活动 想法: 前后一段时间内遇到了类似取交集的,从网上找到了两种写法,再结合GPT等…...
【深度学习】05-Rnn循环神经网络-01- 自然语言处理概述/词嵌入层/循环网络/文本生成案例精讲
循环神经网络(RNN)主要用于自然语言处理的。 循环神经网络(RNN)、卷积神经网络(CNN)和全连接神经网络(FCN)是三种常见的神经网络类型,各自擅长处理不同类型的数据。下面…...
基于JAVA+SpringBoot+Vue的电商平台的设计与实现
基于JAVASpringBootVue的电商平台的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅…...
CSS盒模型-怪异盒模型笔记-思维导图-案例等
文章目录 一、盒模型(重点)二、怪异盒模型三、块级元素和行内元素区别汇总四、块级元素和行内元素的转换(显示方式)||元素的显示和隐藏五、思维导图六、笔记资料 一、盒模型(重点) 所有HTML元素可以看作盒子。 CSS盒模型本质上是…...
thinkphp6开发的通用网站系统源码
thinkphp6开发的通用网站系统源码。 基于ThinkPHP6框架开发的通用后台权限管理系统,底层采用国内最流行的ThinkPHP6框架, 支持内容管理、文章管理、用户管理、权限管理、角色管理等功能。 代码下载百度网盘...
Junit 5 - 理解Mockito,提高UT 覆盖率
前言 当我是1个3年初级程序员时, 我被面试者问到1个问题: 如何保证你的开发任务交付质量 当我是1个7年开发组长时, 我被面试者问到另1个问题:如何保证你的团队的代码质量, 减少rework。 又若干年后, 我才…...
微服务sentinel解析部署使用全流程
sentinel源码地址: 介绍 alibaba/Sentinel Wiki GitHub sentinel官方文档: https://sentinelguard.io/zh-cn/docs/introduction.html Sprong Cloud alibaba Sentinel文档【小例子】 : Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 目录 1、…...
YOLO11震撼发布!
非常高兴地向大家介绍 Ultralytics YOLO系列的新模型: YOLO11! YOLO11 在以往 YOLO 模型基础上带来了一系列强大的功能和优化,使其速度更快、更准确、用途更广泛。主要改进包括 增强了特征提取功能,从而可以更精确地捕捉细节以更…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
