提问人:einpoklum 提问时间:6/6/2022 最后编辑:einpoklum 更新时间:4/4/2023 访问量:2037
如何使用 fmt 打印字符向量?
How do I print a vector of chars using fmt?
问:
我有一个 - 不是以空结尾的。我想使用 fmt 库打印它,而无需复制矢量。const std::vector<char>
我本来希望指定精度就足够了,但 fmt 文档说:
请注意,即使指定了 precision ,C 字符串也必须以 null 结尾。
好吧,我的不是。我必须制作一个副本并用它填充它,还是我能做些什么?\0
答:
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::string
fmt
fmt
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.
评论
cout <<
string_view