C++20 范围 - 如何修改范围?

C++20 ranges - how to modify a range?

我有一个向量定义为:

auto xs = std::vector<double>(5) = { 1.0, 2.0, 3.0, 4.0, 5.0 };

并且我已经在这个向量上创建了一个视图:

auto vi = xs | std::ranges::views::drop(1);

例如。但是,我想将视图数据转换为可操作范围或其他矢量,以便我可以对其进行修改。

到目前为止,我试过这个:

#include <ranges>
#include <algorithm>

auto tmp = std::vector<double>();
std::ranges::copy_n(std::ranges::rbegin(vi), std::ranges::size(vi) - 1, std::back_inserter(tmp));
std::ranges::action::push_back(tmp, 99.99);

但无法识别 push_back 操作。我是否遗漏了一个 header,如果是,哪个不是在 C++20 中实现的?

我也试过:

tmp.push_back(99.99);

但这也不起作用。

我想坚持使用 C++20 实现而不是使用 ranges 库,tmp 的类型可以是完全不同的东西,例如另一种类型或 action/range.

best/most 这样做的有效方法是什么?

However, I'd like to convert the view data into ... another vector so that I can modify it.

您可以使用接受一对迭代器的 std::vector 的构造函数:

template< class InputIt >
constexpr vector( InputIt first, InputIt last,
                  const Allocator& alloc = Allocator() );

std::ranges::action::push_back(tmp, 99.99);

but the push_back action isn't recognised. Am I missing a header, if so, which one or isn't this implemented in C++20?

标准库没有 ranges::action。您可以改用成员函数:

tmp.push_back(99.99);

I've also tried:

tmp.push_back(99.99);

but this doesn't work either.

我看不出为什么这不起作用。我建议考虑一下您期望它做什么以及为什么期望它。