如何使用 fmt 打印字符向量?

How do I print a vector of chars using fmt?

提问人:einpoklum 提问时间:6/6/2022 最后编辑:einpoklum 更新时间:4/4/2023 访问量:2037

问:

我有一个 - 不是以空结尾的。我想使用 fmt 库打印它,而无需复制矢量。const std::vector<char>

我本来希望指定精度就足够了,但 fmt 文档说:

请注意,即使指定了 precision ,C 字符串也必须以 null 结尾。

好吧,我的不是。我必须制作一个副本并用它填充它,还是我能做些什么?\0

C++ 14 C+ +-标准库 null 结尾的 fmt

评论

1赞 Sam Varshavchik 6/6/2022
嗯,这就是它所说的,没有提到替代方案,所以这是唯一的选择。
0赞 einpoklum 6/6/2022
@SamVarshavchik:但也许 fmt 具有一些神奇的序列打印能力?
0赞 tevemadar 6/6/2022
你知道在循环中吗?stackoverflow.com/questions/10750057/......cout <<
1赞 IlCapitano 6/6/2022
是否要将其解释为字符串?如果是这样,你总是可以做一个并使用它。string_view
0赞 einpoklum 6/6/2022
@IlCapitano:所以,我实际上不在 C++20 中,但这会起作用,是的。

答:

7赞 eerorika 6/6/2022 #1

如果可以升级到 C++17,则可以使用 strig 视图参数而不是指向 char 的指针:

const std::vector<char> v;
std::string_view sv(v.data(), v.size());
fmt::format("{}", sv);
2赞 einpoklum 6/6/2022 #2

TL的;博士std::cout << fmt::format("{}", fmt::string_view{v.data(), v.size()});


因此,fmt 接受两种类型的“字符串”:

  • C 样式 - 只是一个指针,必须以 null 结尾。
  • std::string-like - 数据 + 长度。

从 C++17 开始,C++ 正式具有类似引用类型的字符串视图类,它可以引用您的字符向量。(不复制任何东西) - 并且可以打印这些。问题是,您可能不在 C++ 17 中。但是它本身也必须在内部面对这个问题,所以它实际上可以让你得到覆盖 - 在任何版本的标准中,你都可以让fmt本身编译,特别是C++14:std::stringfmtfmt

const std::vector<char> v;
fmt::string_view sv(v.data(), v.size());
auto str = fmt::format("{}", sv);
std::cout << str;

感谢@eerorika让我想到字符串视图。

评论

0赞 Paul Sanders 6/6/2022
这真的很整洁。
1赞 einpoklum 6/7/2022
@vitaut:确实,我曾以为它可能在 C++17 之前不可用,但事实证明它是。
4赞 rturrado 6/6/2022 #3

使用 fmt::join 怎么样?

返回一个视图,该视图格式化范围的元素以 sep 分隔。

[演示]

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

int main() {
    std::vector<char> v{'a', 'b', 'c'};
    fmt::print("{}", fmt::join(v, ""));
}

// Outputs:
//
//   abc

评论

1赞 einpoklum 6/6/2022
对于一个非常大的向量来说,它可能有点过头了,但是的,绝对是的。+1.