Код: Выделить всё
keysУ меня есть данные в одном std :: evector и маски для данных в другом std :: vector . Некоторая функция работает с диапазоном и обновляет все элементы вектора данных, и я хочу использовать его для пар значений/масок. Таким образом, эта функция должна обрабатывать только те значения, которые имеют 1.0F в соответствующих масках. Я ожидаю, что сгенерированный код будет иметь дело с исходными векторами без временных копий. PrettyPrint-Override ">
Код: Выделить всё
#include
#include
#include
#include
void foo(std::ranges::input_range auto& data) {
for (auto it = data.begin(); it != data.end(); ++it) {
*it = 7.0f;
}
}
int main()
{
std::vector values = { 0.0f, 1.0f, 0.0f, 2.0f };
std::vector masks = { 0.0f, 1.0f, 1.0f, 0.0f };
auto filtered = std::views::zip(values, masks) |
std::views::filter([](const auto& tuple) { return std::get(tuple) != 0.0f; });
auto masked = std::views::keys(filtered);
foo(masked);
std::ranges::copy
(
values,
std::ostream_iterator{std::cout, ", "}
);
std::cout
с C ++ 20 У меня есть некоторые варианты здесь. Я реализовал эту версию Demo < /p>
#include
#include
#include
#include
void foo(std::ranges::input_range auto& data) {
for (auto it = data.begin(); it != data.end(); ++it) {
*it = 7.0f;
}
}
int main()
{
std::vector values = { 0.0f, 1.0f, 0.0f, 2.0f };
std::vector masks = { 0.0f, 1.0f, 1.0f, 0.0f };
auto masked = values | std::views::filter([&](const auto& value) {
return masks[&value - values.data()];
});
foo(masked);
std::ranges::copy
(
values,
std::ostream_iterator{std::cout, ", "}
);
std::cout Каким будет способ реализовать это в C ++ 20 здесь? < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79591445/replacement-for-stdviewszip-keys-in-c20[/url]