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 模型基础上带来了一系列强大的功能和优化,使其速度更快、更准确、用途更广泛。主要改进包括 增强了特征提取功能,从而可以更精确地捕捉细节以更…...
机器学习框架(含实例说明)
机器学习框架是用于开发和部署机器学习模型的软件库和工具集。它们提供了一系列的算法、工具和基础设施,帮助开发者更高效地构建、训练和部署机器学习模型。以下是一些主要的机器学习框架及其详细介绍: 1. TensorFlow TensorFlow 是由Google开发的开源…...
vue2与vue3知识点
1.vue2(optionsAPI)选项式API 2.vue3(composition API)响应式API vue3 setup 中this是未定义(undefined)vue3中已经开始弱化this vue2通过this可以拿到vue3setup定义得值和方法 setup语法糖 ref > …...
从源码中学习动态代理模式
动态代理模式 动态代理是 Java 反射(Reflection)API 提供的一种强大机制,它允许在运行时创建对象的代理实例,而不需要在编译时静态地创建。 Java 提供了两种主要的方式来实现动态代理: 基于接口的动态代理:…...
谷歌浏览器完美清除缓存
1.在页面上按下键盘的F12,打开控制台。 2.鼠标放到刷新图标上,点击鼠标右键,选择‘清空缓存并硬性重新加载’。 这样浏览器对网站页面的缓存就彻底被清理干净了。 目前支持该操作方式的浏览器有谷歌和Edge浏览器。 有的浏览器不支持该方式操…...
《如何高效学习》
有道云笔记 第一部分 整体性学习策略 结构 结构就像思想中的一座城市,有很多建筑物,建筑物之间有道路相连,有高大而重要的与其他建筑有上百条路相连,无关紧要的建筑只有少数泥泞的小道与外界相通。 建立良好的知识结构就是绘制…...
阿里云ACP认证考试题库
最近有好些同学,考完阿里云ACP了,再来跟我反馈:自己花700买的阿里云ACP题库,结果答案是错的! 或者考完后发现,买的阿里云ACP题库覆盖率只有50%! 为避免大家继续踩坑,给大家分享一个阿…...
学习经验分享【38】YOLOv11解读——最新YOLO版本
YOLO算法更新速度很快,已经出到V11版本,后续大家有想发论文或者搞项目可更新自己的baseline了。后续将改进YOLOv11算法,有需要的朋友可关注,我会持续进行更新。 YOLO11是Ultralytics YOLO系列实时目标检测器的最新迭代版本&#x…...
电商选品/分析| 亚马逊常见插件爬虫实战之-helium插件
说明 插件爬虫相当于二次爬虫,二次加工信息,因为大部分插件信息也是从正规网上去获取数据,这次列举helium插件爬虫案例,其他插件爬虫也是类似这个方式. 需求 1、⽤⾕歌浏览器,下载chrome extension:“Helium 10 2、登录helium10 3、打开 打开Amazo…...
遇到慢SQL、SQL报错,应如何快速定位问题 | OceanBase优化实践
在数据库的使用中,大家时常会遇到慢SQL,或执行出错的SQL。对于某些SQL问题,其错误原因显而易见,但也有不少情况难以直观判断。面对这类问题,我们应当如何应对?如何准确识别SQL错误的根源?是否需…...
postgresql僵尸进程的处理思路
简介 僵尸进程(zombie process)是指一个已经终止但仍然在进程表中保留条目的进程。正常情况下,当一个进程完成执行并退出时,操作系统会通过父进程调用的wait()或waitpid()系统调用来收集该子进程的退出状态。如果父进程未及时调用…...
wap网站制作怎么做/泉州关键词搜索排名
在工作过程中,我们难免会遇到这样的问题,我们想保存一些数据,但是我们对这些数据的要求并不高,有时候往往只是想要某个时间范围内的数据,比如我们如果永远只关心从当前时间往前推半年内的数据特性,那么我们…...
做外贸要开通哪个网站/南宁网络推广软件
http://blog.csdn.net/ma_jiang/article/details/5962179 1.su oracle 然后启动监听器 1.lsnrctl start 会看到启动成功的界面; 1.lsnrctl stop 停止监听器命令. 1.lsnrctl status 查看监听器命令. oracle数据库的安全包含两部分: 1.一部分是os的安全 2.网…...
用卡通人物做网站属于侵权吗/百度提交网址多久才会收录
满意答案nico402013.08.18采纳率:53% 等级:12已帮助:6620人200分是一个诱惑!-------------------------------------------------------你的问题描述有问题。回答者“tbsoo_com ”的计算这里$i-1是错误的,应该加上括…...
其它区便宜营销型网站建设/宁波seo搜索优化费用
eclipse界面定制,让eclipse看着更清爽转载于:https://www.cnblogs.com/passer1991/p/3227755.html...
药检局信息化网站系统建设方案/新闻最新消息
本节课演示如何以动画的方式,显示或隐藏指定的位图,该功能在日常的开发工作里还是挺常见的。 首先添加一个布尔属性,标识是否显示或隐藏指定的视图。 添加另一个字符串属性,作为和密码输入框进行绑定的状态属性。 添加一个VStack视图,作为子视图的容器。 然后添加一个…...
做微博推广的网站/什么是seo营销
Sub 宏1()Sheets("无汇总").Select End Sub...