最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ fmt庫的使用小結(jié)

 更新時間:2026年07月05日 11:33:58   作者:千里馬-horse  
本文介紹了C++ fmt庫的使用指南,重點突出其簡潔、安全、高效的特點,文章涵蓋格式化輸出、容器/時間格式化及常見問題,具有一定的參考價值,感興趣的可以了解一下

fmt 庫的核心優(yōu)勢是 用法簡潔、類型安全、兼容多場景,以下是從基礎(chǔ)到進(jìn)階的完整使用指南,涵蓋常用功能和關(guān)鍵場景。

一、前置準(zhǔn)備:環(huán)境配置

使用前需確保 fmt 庫已集成到項目中

  1. 編譯依賴:鏈接 fmt 庫(CMake 項目直接鏈接 fmt::fmt 目標(biāo),非 CMake 項目需手動添加頭文件和 src/format.cc 編譯)。
  2. 頭文件引入:核心功能只需包含主頭文件:
    #include <fmt/format.h>   // 核心格式化功能(fmt::format、fmt::print 等)
    #include <fmt/ranges.h>   // 容器格式化(可選,如 vector、map)
    #include <fmt/chrono.h>   // 時間格式化(可選,如 std::chrono)
    

二、核心用法:格式化輸出與字符串構(gòu)建

fmt 的核心 API 是 fmt::format(構(gòu)建字符串)和 fmt::print(直接輸出),語法兼容 Python 格式化風(fēng)格,比 printf 更簡潔,比 iostreams 更高效。

1. 基礎(chǔ)格式化(類似 printf,但更安全)

支持位置參數(shù)、類型自動推導(dǎo),無需手動指定格式符(如 %d %s),錯誤會在編譯時捕獲。

#include <fmt/format.h>
#include <iostream>

int main() {
    // 1. 基礎(chǔ)類型格式化(int、string、float 等)
    std::string msg1 = fmt::format("整數(shù):{},字符串:{},浮點數(shù):{:.2f}", 42, "hello", 3.1415);
    std::cout << msg1 << std::endl;  // 輸出:整數(shù):42,字符串:hello,浮點數(shù):3.14

    // 2. 位置指定(解決參數(shù)順序問題)
    std::string msg2 = fmt::format("第2個參數(shù):{1},第1個參數(shù):{0}", "A", "B");
    std::cout << msg2 << std::endl;  // 輸出:第2個參數(shù):B,第1個參數(shù):A

    // 3. 直接輸出到控制臺(無需手動拼接 cout)
    fmt::print("直接輸出:{} + {} = {}\n", 10, 20, 30);  // 輸出:直接輸出:10 + 20 = 30

    // 4. 輸出到文件(支持 FILE* 或 std::ostream)
    fmt::print(stdout, "輸出到標(biāo)準(zhǔn)輸出\n");
    fmt::print(stderr, "輸出到標(biāo)準(zhǔn)錯誤\n");
    return 0;
}

2. 容器格式化(開箱即用,無需手動遍歷)

包含 <fmt/ranges.h> 后,支持 std::vector、std::arraystd::map 等容器直接格式化,默認(rèn)輸出類似 JSON 風(fēng)格。

#include <fmt/ranges.h>
#include <vector>
#include <map>

int main() {
    std::vector<int> nums = {1, 2, 3, 4};
    fmt::print("向量:{}\n", nums);  // 輸出:向量:[1, 2, 3, 4]

    std::map<std::string, int> score = {{"Alice", 95}, {"Bob", 88}};
    fmt::print("字典:{}\n", score);  // 輸出:字典:{"Alice": 95, "Bob": 88}

    // 自定義分隔符(通過格式說明符)
    fmt::print("向量(空格分隔):{:v}\n", fmt::join(nums, " "));  // 輸出:1 2 3 4
    return 0;
}

3. 時間格式化(兼容 std::chrono)

包含 <fmt/chrono.h> 后,支持時間點、時間段的格式化,無需手動轉(zhuǎn)換 time_t

#include <fmt/chrono.h>
#include <chrono>

int main() {
    // 格式化當(dāng)前時間(本地時間)
    auto now = std::chrono::system_clock::now();
    fmt::print("當(dāng)前時間:{:%Y-%m-%d %H:%M:%S}\n", now);  // 輸出:當(dāng)前時間:2024-10-01 14:30:00

    // 格式化時間段
    std::chrono::duration<double> diff = 2.5h + 30min;
    fmt::print("時長:{}\n", diff);  // 輸出:時長:2h30m0s
    fmt::print("時長(秒):{:.1f}s\n", diff);  // 輸出:時長(秒):9000.0s
    return 0;
}

三、進(jìn)階用法:自定義類型與高級特性

1. 自定義類型格式化(可擴(kuò)展性核心)

通過實現(xiàn) fmt::formatter 模板特化,讓自定義類支持 fmt 格式化,還能兼容編譯時檢查。

#include <fmt/format.h>

// 自定義類
struct Point {
    int x, y;
};

// 為 Point 實現(xiàn) formatter 特化
template <>
struct fmt::formatter<Point> {
    // 解析格式說明符(可選,如 {:x} 控制輸出格式)
    constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
        return ctx.end();  // 此處不處理自定義格式符,直接返回結(jié)束迭代器
    }

    // 格式化邏輯
    template <typename FormatContext>
    auto format(const Point& p, FormatContext& ctx) -> decltype(ctx.out()) {
        // 拼接輸出:(x, y)
        return fmt::format_to(ctx.out(), "({}, {})", p.x, p.y);
    }
};

int main() {
    Point p = {10, 20};
    fmt::print("坐標(biāo):{}\n", p);  // 輸出:坐標(biāo):(10, 20)
    return 0;
}

2. 避免緩沖區(qū)溢出:安全寫入

fmt::format_to_n 可限制輸出長度,防止緩沖區(qū)溢出,返回實際寫入的字符數(shù)和是否截斷的標(biāo)記。

#include <fmt/format.h>
#include <array>

int main() {
    std::array<char, 10> buf;  // 固定大小緩沖區(qū)(最多存 9 個字符 + 終止符)
    auto [size, truncated] = fmt::format_to_n(buf.data(), buf.size() - 1, "Hello {}", "World");
    buf[size] = '\0';  // 手動添加字符串終止符

    fmt::print("結(jié)果:{},是否截斷:{}\n", buf.data(), truncated);  // 輸出:結(jié)果:Hello W,是否截斷:true
    return 0;
}

3. 動態(tài)參數(shù)(運行時確定參數(shù)個數(shù))

當(dāng)參數(shù)個數(shù)不確定時,使用 fmt::dynamic_format_arg_store 動態(tài)添加參數(shù),適合日志、配置等場景。

#include <fmt/format.h>
#include <vector>

int main() {
    fmt::dynamic_format_arg_store<fmt::format_context> args;
    args.push_back("name");
    args.push_back("Alice");
    args.push_back("age");
    args.push_back(25);

    // 動態(tài)參數(shù)格式化
    std::string msg = fmt::vformat("{}: {}, {}: {}", args);
    fmt::print("{}\n", msg);  // 輸出:name: Alice, age: 25
    return 0;
}

四、特殊場景:與 C 標(biāo)準(zhǔn)庫 / STL 兼容

1. 兼容 printf 格式符

如果習(xí)慣 printf 的格式符(如 %04d %x),fmt 完全支持,同時保留類型安全。

#include <fmt/format.h>

int main() {
    // 用 printf 格式符格式化
    fmt::print("十六進(jìn)制:{:x}\n", 255);    // 輸出:ff
    fmt::print("補(bǔ)零對齊:{:04d}\n", 42);   // 輸出:0042
    fmt::print("科學(xué)計數(shù)法:{:e}\n", 123.4); // 輸出:1.234000e+02
    return 0;
}

2. 格式化 STL 字符串與流

支持 std::string、std::wstring,也可輸出到 std::ostream(如 std::cout)。

#include <fmt/format.h>
#include <string>
#include <iostream>

int main() {
    std::string name = "Bob";
    // 格式化 std::string
    std::string msg = fmt::format("Hello, {}", name);
    std::cout << msg << std::endl;  // 輸出:Hello, Bob

    // 直接輸出到 std::ostream
    fmt::print(std::cout, "Width: {}\n", 100);  // 等價于 std::cout << "Width: 100" << std::endl
    return 0;
}

五、常見問題與注意事項

  1. 編譯錯誤:若使用容器 / 時間格式化時報錯,檢查是否包含對應(yīng)的頭文件(<fmt/ranges.h> <fmt/chrono.h>)。
  2. C++ 版本要求:核心功能支持 C++11 及以上,部分高級特性(如編譯時格式檢查)需 C++17+。
  3. 性能優(yōu)化:頻繁格式化場景可使用 fmt::memory_buffer 復(fù)用緩沖區(qū),減少內(nèi)存分配:
    fmt::memory_buffer buf;
    fmt::format_to(buf, "First: {}", 1);
    fmt::format_to(buf, ", Second: {}", 2);
    std::string result = fmt::to_string(buf);  // 結(jié)果:"First: 1, Second: 2"
    

總結(jié)

fmt 庫的使用核心是 “簡潔 + 安全”:基礎(chǔ)場景用 fmt::format/fmt::print 替代 printf/iostreams,進(jìn)階場景(自定義類型、動態(tài)參數(shù))通過擴(kuò)展 formatter 或 dynamic_format_arg_store 實現(xiàn),同時保持高性能和跨平臺兼容性。

到此這篇關(guān)于C++ fmt庫的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++ fmt庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • C++簡易通訊錄系統(tǒng)實現(xiàn)流程詳解

    C++簡易通訊錄系統(tǒng)實現(xiàn)流程詳解

    這篇文章主要為大家介紹了C語言簡易版通訊錄的具體實現(xiàn)流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++高性能服務(wù)器框架之協(xié)程調(diào)度模塊

    C++高性能服務(wù)器框架之協(xié)程調(diào)度模塊

    這篇文章主要介紹了C++高性能服務(wù)器框架中的協(xié)程調(diào)度模塊,文中通過代碼示例介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • C語言預(yù)處理預(yù)編譯命令及宏定義詳解

    C語言預(yù)處理預(yù)編譯命令及宏定義詳解

    這篇文章主要為大家介紹了C語言預(yù)處理預(yù)編譯命令及宏定義的詳解,其中包含運行環(huán)境命名約定條件及#under等基礎(chǔ)詳解,有需要的朋友可以借鑒參考下
    2021-10-10
  • C++ List鏈表的介紹和使用

    C++ List鏈表的介紹和使用

    list是可以在常數(shù)范圍內(nèi)在任意位置進(jìn)行插入和刪除的序列式容器,并且該容器可以前后雙向迭代,這篇文章主要介紹了C++ List鏈表的介紹和使用,需要的朋友可以參考下
    2023-03-03
  • c/c++的opencv椒鹽噪聲的實現(xiàn)

    c/c++的opencv椒鹽噪聲的實現(xiàn)

    椒鹽噪聲是一種簡單的圖像噪聲模型,通過在C/C++中利用隨機(jī)數(shù)生成器,我們可以有效地模擬這種噪聲,本文就來介紹一下如何實現(xiàn),感興趣的可以了解一下
    2025-05-05
  • 從零實現(xiàn)一個 C++ 輕量級日志系統(tǒng)原理與實踐指南

    從零實現(xiàn)一個 C++ 輕量級日志系統(tǒng)原理與實踐指南

    本文從零開始手搓一個簡易C++日志工具,詳細(xì)介紹了日志系統(tǒng)的理念、設(shè)計、實現(xiàn)及優(yōu)化,核心包括:日志格式化時間和等級,基于策略模式實現(xiàn)異步刷新,使用RAII機(jī)制實現(xiàn)自動刷新,以及對線程安全和可重入性的深度考量,最后還提供了優(yōu)化方向,幫助讀者完善日志系統(tǒng)
    2026-05-05
  • C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    這篇文章主要介紹了C++枚舉類型用法總結(jié)(枚舉字符常量代替常量),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 簡單講解C語言中宏的定義與使用

    簡單講解C語言中宏的定義與使用

    這篇文章主要介紹了C語言中宏的定義與使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)實例講解單鏈表的實現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)實例講解單鏈表的實現(xiàn)

    單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C++,我們就要奠定好這塊基石!接下來就和我一起學(xué)習(xí)吧
    2022-03-03
  • 最新評論

    靖宇县| 麻城市| 余干县| 翼城县| 舒城县| 中方县| 小金县| 长寿区| 卢氏县| 泰顺县| 隆林| 普安县| 习水县| 湖州市| 陈巴尔虎旗| 西乌| 永福县| 丽水市| 县级市| 陈巴尔虎旗| 德江县| 盐池县| 阜宁县| 胶州市| 宜州市| 克山县| 登封市| 通渭县| 寻甸| 兴仁县| 龙山县| 义马市| 湖口县| 两当县| 都江堰市| 和田县| 潞西市| 布拖县| 北票市| 赤水市| 泗水县|