如何使用range-v3库按谓词规则分割字符串(如车牌字符分组)?
使用range-v3按自定义谓词分割范围
range-v3库里确实有正好匹配你需求的工具——ranges::group_by 适配器,它能根据你指定的谓词,把输入范围里相邻且满足“同组条件”的元素归为子范围,完全支持isdigit、iseven这类判断逻辑。
针对车牌/字母数字分割的实现
- 先定义分组判断逻辑:判断两个相邻字符是否属于同一类别(同为数字或同为字母)
#include <range/v3/all.hpp> #include <cctype> #include <string> auto same_char_category = [](char a, char b) { return std::isdigit(a) == std::isdigit(b); }; - 用
group_by分组后,通过join_with给各组之间加空格,最后转成字符串:std::string split_alnum(const std::string& input) { return input | ranges::views::group_by(same_char_category) | ranges::views::join_with(' ') | ranges::to<std::string>(); } - 测试效果:
- 输入
kz083y68→ 输出kz 083 y 68 - 输入
3486nv09→ 输出3486 nv 09
- 输入
扩展到其他谓词(比如iseven)
如果要按奇偶分割整数序列,只需要换个谓词就行:
auto same_parity = [](int a, int b) { return (a % 2) == (b % 2); }; // 调用示例 std::vector<int> nums = {1,3,2,4,5}; auto result = nums | ranges::views::group_by(same_parity) | ranges::views::transform([](auto r) { return ranges::to<std::string>(r); }) | ranges::views::join_with(' ') | ranges::to<std::string>(); // 最终结果为 "13 24 5"
内容的提问来源于stack exchange,提问作者Daniil Rozanov
相关产品推荐
相关产品推荐

