C++中打印缩进时,能否不复制就重复输出std::string_view?
无需复制字符串实现重复输出std::string_view的方法
你要实现的是重复输出std::string_view内容且不复制字符串的需求,核心思路是直接循环输出原视图指向的内容,完全不需要拼接生成新字符串,避免额外内存开销。
针对你给出的Logger类,有两种高效实现方式:
方式一:使用C标准库printf
利用printf的%.*s格式符,直接输出std::string_view的内容,循环level次即可:
#include <cstdio> #include <string_view> struct Logger { static inline constexpr std::string_view indent = " "; static inline int level = 0; Logger() { level++; } // 补充析构函数维护level计数 ~Logger() { level--; } void log(const std::string &msg) { // 循环输出indent level次 for (int i = 0; i < level; ++i) { // %.*s 中,*对应长度参数,s对应字符指针 std::printf("%.*s", static_cast<int>(indent.size()), indent.data()); } std::printf("%s\n", msg.c_str()); } };
方式二:使用C++标准库iostream
C++的ostream已经原生支持std::string_view的输出,代码更简洁:
#include <iostream> #include <string_view> #include <string> struct Logger { static inline constexpr std::string_view indent = " "; static inline int level = 0; Logger() { level++; } ~Logger() { level--; } void log(const std::string &msg) { for (int i = 0; i < level; ++i) { std::cout << indent; } std::cout << msg << '\n'; } };
关键说明
- 这两种方式都不会复制
indent指向的字符串,只是重复输出原内存中的内容,完全符合你的需求。 - 无法直接生成一个包含重复内容的
std::string_view,因为string_view是对连续内存中现有字符序列的视图,而重复后的内容并不存在于连续内存块中,所以循环输出是最高效的解决方案。
内容的提问来源于stack exchange,提问作者Gtylcara
相关产品推荐
相关产品推荐

