我有一个简单的C++代码。我想得到一个长字符串,其中包含一些重复的std::string_view
;有没有一种方法可以做到这一点,而不复制字符串?
#include <cstdio>
#include <string_view>
struct Logger {
static inline constexpr std::string_view indent = " ";
static inline int level = 0;
Logger() {
level++;
}
// ...
void log(const std::string &msg) {
std::printf(/* repeat indent 'level' times */);
}
};
3条答案
按热度按时间fhg3lkii1#
C风格解决方案
std::printf
允许您动态指定字段宽度。例如:这将输出:
我们可以使用这个技巧,因为缩进总是由一个字符组成,所以我们不必重复完整的
std::string_view
。显然,如果您希望缩进是多个字符的混合,这将不起作用,但这将是非常不寻常的。老派C++解决方案
然而,这是一个非常C风格的解决方案,你可以使用一个循环来避免复制:
但是,如果缩进不是不同字符的混合,我们可以使用上面的
std::cout
来避免这种循环:如果你坚持使用
std::printf
,我们仍然可以这样做:你的
indent
字符串可以用同样的方式打印出来。uhry853o2#
你的问题的答案是否
但是
std::views::repeat
或std::ranges::repeat_view
可以帮助您编写更简洁、更易读的代码。或者,如果你事先知道最大缩进,你可以初始化
string_view
的std::array
,其中维度是最大缩进的数量,其中每个string_view
都有模式的增量重复。liwlm1x93#
我会尝试做尽可能长的识别,然后提取子视图形式:
但我认为这不是你实际需要的。