在 C++20 中如何传递范围而不是迭代器对?

问题描述 投票:0回答:1

我听说 C++20 将支持作用于范围,而不仅仅是开始+结束迭代器对。这是否意味着,在 C++20 中,我将能够编写:

std::vector<int> vec = get_vector_from_somewhere();
std::sort(vec);
std::vector<float> halves; 
halves.reserve(vec.size());
std::transform(
    vec, std::back_inserter(halves),
    [](int x) { return x * 0.5; }
);

c++ range c++20
1个回答
12
投票

几乎,是的!

您只需要使用

std::ranges::
命名空间,而不仅仅是
std::
;至少,这是埃里克·尼伯勒(Eric Niebler)在他的博客文章中所说的。所以,你会写: std::vector<int> vec = get_vector_from_somewhere(); std::ranges::sort(vec); std::vector<float> halves; halves.reserve(vec.size()); std::ranges::transform( vec, std::back_inserter(halves), [](int x) { return x * 0.5; } );

您还可以查看 
std::all_of

(以及 none_of

any_of
)上的
cppreference page
,获取 C++20 风格
<algorithm>
代码的详细示例;但并非所有这些页面都已写入 cppreference.com 上。

正如 @Barry 所说,如果我们可以使用
ranges::to

(在 C++20 中不能,但在 C++23 中可以),我们可以让事情变得更简单:

std::vector<int> vec = get_vector_from_somewhere();
std::ranges::sort(vec);
auto halves = vec
    | std::ranges::view::transform([](int x){ return x * 0.5; }) 
    | ranges::to<std::vector<float>>;

© www.soinside.com 2019 - 2024. All rights reserved.