我听说 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; }
);
?
您只需要使用
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>>;