You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用fmt库自定义格式化pair向量以生成指定格式输出?

实现用fmt::join格式化std::pair向量为指定格式

直接使用fmt::format("{}", fmt::join(myVec, "|"))无法得到目标输出,因为fmt库默认没有提供std::pair<int, std::string>的格式化规则。以下是两种可行的实现方式:

方法一:自定义fmt格式化器特化

通过特化fmt::formatter模板,告诉fmt库如何将std::pair格式化为"key=value"的形式,之后fmt::join就能自动处理每个元素并拼接:

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

// 为std::pair<int, std::string>特化格式化器
template <>
struct fmt::formatter<std::pair<int, std::string>> {
  constexpr auto parse(fmt::format_context::parse_context& ctx) {
    return ctx.begin(); // 使用默认解析逻辑
  }

  template <typename FormatContext>
  auto format(const std::pair<int, std::string>& p, FormatContext& ctx) {
    // 定义pair的格式化规则:"first=second"
    return fmt::format_to(ctx.out(), "{}={}", p.first, p.second);
  }
};

int main() {
  std::vector<std::pair<int, std::string>> myVec;
  myVec.emplace_back(12,"A");
  myVec.emplace_back(13,"B");
  myVec.emplace_back(14,"C");

  std::string result = fmt::format("{}", fmt::join(myVec, "|"));
  fmt::print("{}\n", result); // 输出:12=A|13=B|14=C
  return 0;
}

这种方式适合需要在多个场景格式化同类型pair的情况,一次定义即可全局复用。

方法二:使用临时格式化逻辑(无需全局特化)

如果不想修改全局格式化规则,可以在fmt::join中直接传入lambda表达式,对每个pair做临时格式化:

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

int main() {
  std::vector<std::pair<int, std::string>> myVec;
  myVec.emplace_back(12,"A");
  myVec.emplace_back(13,"B");
  myVec.emplace_back(14,"C");

  std::string result = fmt::format("{}", fmt::join(myVec, "|", [](const auto& p) {
    return fmt::format("{}={}", p.first, p.second);
  }));

  fmt::print("{}\n", result); // 输出:12=A|13=B|14=C
  return 0;
}

对于fmt 9.0及以上版本,还可以使用更简洁的范围格式化语法,直接通过格式说明符指定拼接规则:

std::string result = fmt::format("{:join(|, {}={})}", myVec);

这种方式更适合单次使用的场景,代码更紧凑。

内容的提问来源于stack exchange,提问作者user1658476

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:38:14