Сообщение Re: Может я чего-то не понимаю.... от 26.07.2023 11:48
Изменено 26.07.2023 11:50 Sm0ke
Re: Может я чего-то не понимаю....
Здравствуйте, B0FEE664, Вы писали:
BFE>Знакомясь с возможностями C++20 наткнулся на статью здесь
BFE>Предлагается решить задачу:
BFE>[q]
BFE>Допустим, есть вектор с целыми числами, и требуется поделить все его числа на два. Те, которые не делятся, нужно просто выкинуть.
Вариант с алгоритмами: https://godbolt.org/z/T4Ya6q58T
Деление и остаток в некоторых платформах делается за одну инструкцию, так воспользуемся std::div()
Теперь Обычным Циклом:
BFE>Знакомясь с возможностями C++20 наткнулся на статью здесь
BFE>Предлагается решить задачу:
BFE>[q]
BFE>Допустим, есть вектор с целыми числами, и требуется поделить все его числа на два. Те, которые не делятся, нужно просто выкинуть.
Вариант с алгоритмами: https://godbolt.org/z/T4Ya6q58T
auto v_pred = [](my_item p) { return p % 2 == 0; };
auto v_mod = [](my_item p) { return p / 2; };
std::ranges::copy(
std::ranges::filter_view(v_src, v_pred) | std::views::transform(v_mod),
std::back_inserter(v_dest)
);
Деление и остаток в некоторых платформах делается за одну инструкцию, так воспользуемся std::div()
auto v_mod_1 = [](my_item p) { return std::div(p, 2); };
auto v_pred = [](const std::div_t & p) { return p.rem == 0; };
auto v_mod_2 = [](const std::div_t & p) { return p.quot; };
std::ranges::copy(
std::ranges::transform_view(v_src, v_mod_1) | std::views::filter(v_pred) | std::views::transform(v_mod_2),
std::back_inserter(v_dest)
);
Теперь Обычным Циклом:
for( auto it : v_src ) if( std::div_t res = std::div(it, 2); res.rem == 0 ) { v_dest.push_back(res.quot); }
Re: Может я чего-то не понимаю....
Здравствуйте, B0FEE664, Вы писали:
BFE>Знакомясь с возможностями C++20 наткнулся на статью здесь
BFE>Предлагается решить задачу:
BFE>[q]
BFE>Допустим, есть вектор с целыми числами, и требуется поделить все его числа на два. Те, которые не делятся, нужно просто выкинуть.
Вариант с алгоритмами: https://godbolt.org/z/T4Ya6q58T
Деление и остаток в некоторых платформах делается за одну инструкцию, так воспользуемся std::div()
Теперь Обычным Циклом:
Циклом, но без div():
Но это же надо мерить по производительности
BFE>Знакомясь с возможностями C++20 наткнулся на статью здесь
BFE>Предлагается решить задачу:
BFE>[q]
BFE>Допустим, есть вектор с целыми числами, и требуется поделить все его числа на два. Те, которые не делятся, нужно просто выкинуть.
Вариант с алгоритмами: https://godbolt.org/z/T4Ya6q58T
auto v_pred = [](my_item p) { return p % 2 == 0; };
auto v_mod = [](my_item p) { return p / 2; };
std::ranges::copy(
std::ranges::filter_view(v_src, v_pred) | std::views::transform(v_mod),
std::back_inserter(v_dest)
);
Деление и остаток в некоторых платформах делается за одну инструкцию, так воспользуемся std::div()
auto v_mod_1 = [](my_item p) { return std::div(p, 2); };
auto v_pred = [](const std::div_t & p) { return p.rem == 0; };
auto v_mod_2 = [](const std::div_t & p) { return p.quot; };
std::ranges::copy(
std::ranges::transform_view(v_src, v_mod_1) | std::views::filter(v_pred) | std::views::transform(v_mod_2),
std::back_inserter(v_dest)
);
Теперь Обычным Циклом:
for( auto it : v_src ) if( std::div_t res = std::div(it, 2); res.rem == 0 ) { v_dest.push_back(res.quot); }
Циклом, но без div():
for( auto it : v_src ) if( it % 2 == 0 ) { v_dest.push_back(it / 2); }
Но это же надо мерить по производительности