Информация об изменениях

Сообщение 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

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

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); }


Но это же надо мерить по производительности