首页 > 解决方案 > 如何在一次字符串传递中擦除非字母字符并将字母字符小写?

问题描述

给定一个字符串:

std::string str{"This i_s A stRIng"};

是否可以将其转换为小写并一次性删除所有非字母字符?

预期结果:

this is a string

我知道您可以使用std::transform(..., ::tolower)andstring.erase(remove_if())组合进行两次传递,或者可以通过迭代每个字符手动完成,但是有没有一种方法可以组合std::transformanderase调用而不必多次运行字符串?

标签: c++stringstl-algorithm

解决方案


C++20 范围允许以一次性方式组合算法。

std::string str{"This i_s A stRIng"};
std::string out;

auto is_alpha_or_space = [](unsigned char c){ return isalpha(c) || isspace(c); };
auto safe_tolower = [](unsigned char c){ return tolower(c); };

std::ranges::copy( str
    | std::views::filter(is_alpha_or_space)
    | std::views::transform(safe_tolower)
    , std::back_inserter(out));

在编译器资源管理器上查看


推荐阅读