Замена для std :: views :: zip/keys в C ++ 20C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Замена для std :: views :: zip/keys в C ++ 20

Сообщение Anonymous »

Мне нужно перенести какой -то код из C ++ 23, который использует STD :: Views :: Zip/Keys to C ++ 20 (портирование в CUDA) (который не имеет этой функциональности), имея только один конкретный случай использования этого кода.
У меня есть данные в одном std :: вектор и маски для данных в другом std :: вектор. Некоторая функция работает с диапазоном и обновляет все элементы вектора данных, и я хочу использовать его для пар значений/масок. Таким образом, эта функция должна обрабатывать только те значения, которые имеют 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
, который работает очень хорошо, но кажется «взломом» с этим индексом, вычитая values.data () адрес из адреса значения; Что ж, это не самое худшее, но может быть хрупким и может быть на пути компилятора для реализации оценки ленивых диапазонов, поэтому я считаю ее «достаточно хорошим», но все же не уверен, что это лучший способ сделать это. маски массив и обработка там, но я не хочу иметь дупликацию кода, поскольку реальная функция foo является сложной.
Я могу передать дополнительный параметр для функции foo , который будет задействовать masks , но не будет выполнено, что это будет/код, но впоследствии fot emks emk emk emks emk emk emk emk emk emk emk emk emk emk emk emk emk emk emk emk emk emk emk Уже есть некоторые параметры по умолчанию, так что это было бы неудобно. C ++ 20 Здесь?


Подробнее здесь: https://stackoverflow.com/questions/795 ... eys-in-c20
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Замена для std :: views :: zip/keys в C ++ 20
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Замена для std :: views :: zip/keys в C ++ 20
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Замена для std :: views :: zip/keys в C ++ 20
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Замена для std :: views :: zip/keys в C ++ 20
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Каково использование std :: ranges :: views :: lazy_split, когда у нас есть std :: ranges :: views :: split?
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»