当前位置: 首页 > 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;从而可以更精确地捕捉细节以更…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

GB/T 43887-2024 核级柔性石墨板材检测

核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标&#xff1a; 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...