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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:15:11