Мне нужно перенести какой -то код из 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++
Программы на C++. Форум разработчиков
-
Anonymous
1745528892
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 Здесь?
Подробнее здесь: [url]https://stackoverflow.com/questions/79591445/replacement-for-stdviewszip-keys-in-c20[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия