Cor*_*101 9 c++ c++20 std-ranges
例如std::ranges::transform_view
范围适配器,表示对每个元素应用转换函数后底层序列的视图。
和std::ranges::transform
将给定函数应用于一个范围,并将结果存储在另一个范围中,从 result 开始。
如果我们想将字符串转换为大写,我们可以同时使用算法和视图:
int main() {
std::string in{ "hello\n" };
std::string out;
// using transform view
std::ranges::copy( std::views::transform(in, toupper), std::back_inserter(out) );
std::cout << out;
out.clear();
// using transform algorithm
std::ranges::transform(in, std::back_inserter(out), ::toupper);
std::cout << out;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
视图能完成哪些算法无法完成的任务,反之亦然?我什么时候应该选择其中一种而不是另一种?
简短的版本是:
您可以使用对您要解决的问题最有意义的方法。如果您只是 transform将一个范围转换为另一个范围,则该算法是最直接的解决方案。如果您正在构建一组更复杂的操作(也许您不只是转换每个元素,而只是转换一些元素?),那么您可能需要构建一个适配器管道。
它也不是一个或另一个的事情 - 正如您的示例所示,即使您使用适配器 ( views::transform),您仍然也在使用算法 ( ranges::copy)。范围适配器管道通常以算法结束。例如,如果我想要最小的字母(不区分大小写)怎么办?我可能会这样做:
char smallest = std::ranges::min(
in | std::views::filter([](unsigned char c){ return std::isalpha(c); })
| std::views::transform([](unsigned char c){ return std::tolower(c); })
);
Run Code Online (Sandbox Code Playgroud)
适配器帮助我(懒惰地)建立一系列小写字母,然后算法(热切地)给我答案。
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |