Мне нужно перенести какой -то код из 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
Замена для std :: views :: zip/keys в C ++ 20 ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение