是否有工具可迭代std::string_view行并返回std::string_view?
针对std::string_view的行迭代工具方案
标准库目前没有直接提供专为std::string_view设计的行迭代工具,但可以轻松实现轻量的迭代逻辑,全程基于std::string_view操作,完全避免数据拷贝,和你伪代码的需求匹配。
核心实现思路
- 维护一个待处理的
std::string_view片段,每次定位换行符(兼容\n和\r\n两种格式) - 提取当前行的
std::string_view后,将待处理片段的起始位置移至换行符之后 - 自动处理无结尾换行符的最后一行
示例实现代码
#include <string_view> #include <algorithm> class StringViewLineReader { public: explicit StringViewLineReader(std::string_view source) : remaining_(source) { fetch_next_line(); } bool has_line() const { return !current_line_.empty() || !remaining_.empty(); } std::string_view next_line() { auto line = current_line_; fetch_next_line(); return line; } private: void fetch_next_line() { current_line_.remove_prefix(current_line_.size()); if (remaining_.empty()) return; // 查找第一个换行符(\n或\r) const auto newline_pos = remaining_.find_first_of("\n\r"); if (newline_pos == std::string_view::npos) { current_line_ = remaining_; remaining_.remove_prefix(remaining_.size()); return; } current_line_ = remaining_.substr(0, newline_pos); // 跳过当前换行符,兼容\r\n的情况 remaining_.remove_prefix(newline_pos + 1); if (!remaining_.empty() && remaining_.front() == '\n') { remaining_.remove_prefix(1); } } std::string_view remaining_; std::string_view current_line_; }; // 使用示例 void process_lines(std::string_view content) { StringViewLineReader reader(content); while (reader.has_line()) { std::string_view line = reader.next_line(); // 对行进行处理,无任何数据拷贝 } }
进阶扩展
如果使用C20及以上版本,可以基于范围库(Ranges)实现自定义视图,让迭代更符合现代C语法风格,比如支持range-for循环,本质逻辑和上面的实现一致,同样全程无拷贝。
部分第三方库也提供了配套string_view的行迭代工具,但如果仅依赖标准库,自己实现的代码量极小,且行为完全可控。
内容的提问来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

