小编Cor*_*101的帖子

我什么时候应该使用范围适配器而不是范围算法?

各种范围适配器提供的许多功能似乎与算法库非常相似。

例如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++ c++20 std-ranges

9
推荐指数
1
解决办法
524
查看次数

为什么范围库为每个视图定义两个名称?

在 c++20 的范围库中,所有视图都有第二个版本。

例如,std::ranges::views::filter

根据 cppreference:

对于任何合适的子表达式 E 和 P,表达式views::filter(E, P) 与filter_view{E, P} 表达式等价。

我们有实际的类,std::ranges::filter_view然后放入我们拥有的视图命名空间中std::ranges::views::filter。两者之间有什么区别,还是纯粹是风格问题?

c++ range c++20

6
推荐指数
1
解决办法
644
查看次数

如何使用 std::format 打印容器的内容

使用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 标准库版本中做同样的事情吗?

c++ format c++20

4
推荐指数
1
解决办法
1250
查看次数

标签 统计

c++ ×3

c++20 ×3

format ×1

range ×1

std-ranges ×1