c++ - 如何使用 range v3 库将字符串拆分为由规则定义的序列?

标签 c++ algorithm range-v3

我有一串车号,例如kz083y68,我想将其转换为带有空格的kz 083 y 68。字符串也可以是3486nv09等,因此没有固定的分割位置。我需要的只是用空格分割数字和字母的子序列。

显然这可以手动完成,但我想知道 range-v3 库中是否有一个函数可以实现此目的。一般来说,也许有一个函数接受一些谓词(isdigitisevenisdog)并将给定范围拆分为相应的子范围? p>

最佳答案

使用views::chunk_by获取一组 subview :

#include <cctype>
#include <fmt/ranges.h>
#include <ranges>
#include <string>

int main() {
  std::string_view plate_code{"kz083y68"};
  auto views = plate_code |
            std::views::chunk_by([](auto lhs, auto rhs) {
              // Thanks @Jarod42 for the simplified predicate!
              return std::isdigit(lhs) == std::isdigit(rhs);
            });
  for (auto const view : views) {
    fmt::print("{}", view);
  }  // ['k', 'z']['0', '8', '3']['y']['6', '8']
}

DEMO .

您可以使用 views::join_with 获取带有选定分隔符的单个 View :

int main() {
  std::string_view plate_code{"kz083y68"};
  auto view = plate_code | std::views::chunk_by([](auto lhs, auto rhs) {
                return std::isdigit(lhs) == std::isdigit(rhs);
              }) |
              std::views::join_with(' ');
  fmt::print("{}", view);
  // ['k', 'z', ' ', '0', '8', '3', ' ', 'y', ' ', '6', '8']
}

DEMO .

关于c++ - 如何使用 range v3 库将字符串拆分为由规则定义的序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76867919/

相关文章:

c++ - VC是否符合警告C4407的标准?

c++ - C++中对象的动态成员

algorithm - 是否有用于多参数预测的特殊类型的多元回归?

c++ - 可写的 zip 范围是不可能的?

c++ - Range-V3:获取基础迭代器

c++ - C++代码中的四个错误,我找不到解决方案

c++ - clang 模板化使用 __attribute__((vector_size(N)))

c++ - 获取 range-v3 vector 对的交集

algorithm - 在钟形值列表中找到最大值的快速算法

javascript - 数组排列/组合