例如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)
视图能完成哪些算法无法完成的任务,反之亦然?我什么时候应该选择其中一种而不是另一种?
在 c++20 的范围库中,所有视图都有第二个版本。
根据 cppreference:
对于任何合适的子表达式 E 和 P,表达式views::filter(E, P) 与filter_view{E, P} 表达式等价。
我们有实际的类,std::ranges::filter_view然后放入我们拥有的视图命名空间中std::ranges::views::filter。两者之间有什么区别,还是纯粹是风格问题?
使用fmtlib,我们可以打印容器,如下所示:
#include <vector>
#include <fmt/ranges.h>
int main() {
std::vector<int> v = {1, 2, 3};
fmt::print("{}\n", v);
}
Run Code Online (Sandbox Code Playgroud)
我可以在 c++20 标准库版本中做同样的事情吗?