如何使用迭代器和std::string_view将字符串拆分为1024大小的块
实现方案
你需要实现一个符合STL输入迭代器规范的块迭代器,迭代时自动按指定大小切分字符串,返回std::string_view避免内存拷贝,即可支持你示例中的范围构造写法。
注:原示例中
_iterator以下划线+大写字母开头属于C++标准保留标识符,实际使用建议改为chunk_iterator这类合规命名,避免未定义行为。
完整实现代码
#include <string> #include <string_view> #include <vector> #include <iterator> #include <algorithm> template <typename CharT> class chunk_iterator { public: // 迭代器类型定义,满足STL输入迭代器要求 using iterator_category = std::input_iterator_tag; using value_type = std::basic_string_view<CharT>; using difference_type = std::ptrdiff_t; using pointer = const value_type*; using reference = value_type; // 尾迭代器默认构造 chunk_iterator() = default; // 构造迭代器:传入源字符串、切分块大小 chunk_iterator(const std::basic_string<CharT>& content, size_t chunk_size) : remaining_(content), chunk_size_(chunk_size) { next(); // 初始化第一个块 } // 解引用返回当前块的string_view reference operator*() const { return current_; } pointer operator->() const { return ¤t_; } // 前缀自增,跳到下一个块 chunk_iterator& operator++() { next(); return *this; } // 后缀自增 chunk_iterator operator++(int) { chunk_iterator temp = *this; next(); return temp; } // 迭代器相等判断 bool operator==(const chunk_iterator& other) const { // 两个都为结束状态时判定相等 if (remaining_.empty() && other.remaining_.empty()) { return true; } // 否则比对剩余内容起始地址、长度、块大小 return remaining_.data() == other.remaining_.data() && remaining_.size() == other.remaining_.size() && chunk_size_ == other.chunk_size_; } bool operator!=(const chunk_iterator& other) const { return !(*this == other); } private: std::basic_string_view<CharT> remaining_; size_t chunk_size_ = 0; value_type current_; // 切分下一个块 void next() { if (remaining_.empty()) { current_ = {}; return; } size_t current_size = std::min(chunk_size_, remaining_.size()); current_ = remaining_.substr(0, current_size); remaining_ = remaining_.substr(current_size); } };
使用示例
和你需求的写法完全兼容:
int main() { std::string content = "这里是待拆分的长字符串,长度超过1024后会自动切分块..."; // 范围构造vector,每块大小1024字节 std::vector<std::string_view> data{ chunk_iterator<char>{content, 1024}, chunk_iterator<char>{} }; // 遍历验证切分结果 for (size_t i = 0; i < data.size(); ++i) { printf("第%zu块,长度%zu:%.*s\n", i, data[i].size(), (int)data[i].size(), data[i].data()); } return 0; }
说明
- 全程使用
std::string_view存储切分结果,不会拷贝原字符串内容,内存开销极低,性能接近手动指针偏移切分。 - 迭代器完全符合STL规范,除了构造
std::vector,也可直接用于范围for、标准库算法(比如std::for_each遍历)等场景。 - 注意事项:原字符串的生命周期必须长于切分得到的所有
std::string_view,避免出现悬空指针问题。
内容的提问来源于stack exchange,提问作者isudfv
相关产品推荐
相关产品推荐

