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

Сообщение Re: Может я чего-то не понимаю.... от 25.07.2023 23:27

Изменено 25.07.2023 23:30 rg45

Re: Может я чего-то не понимаю....
Здравствуйте, B0FEE664, Вы писали:

BFE>Немного удивившись такому решению, быстрым поиском нашёл похожее у MS здесь

BFE>Почему так сложно? Ведь задача решается в одну строчку:
BFE>
BFE>std::remove_if(numbers_in.begin(), numbers_in.end(), [](int& x){ const int s = x; x /= 2; return (s%2)==1; } );
BFE>

BFE>Или так нельзя?

Ну, во-первых, правильно выше подсказывают, здесь не хватает вызова erase. И если его добавить, то твоя строчка становится чуть длиннее:

   numbers_in.erase(std::remove_if(numbers_in.begin(), numbers_in.end(), [](int& x){ const int s = x; x /= 2; return (s%2)==1; } ), numbers_in.end());


Во-вторых, по условию задачи результат нужно было сложить в другой массив, а ты удаляешь прямо в исходном. Или ты собираешься сперва скопировать все содержимое, а потом уже удалять? Это вообще не спортивно.

Ну и в-третьих, а чем, в данном случае, хуже "лобовое" решение с использованием обычного цикла?

  for(auto&& x : numbers_in) if (!x % 2) numbers_out.push_back(x / 2);
Re: Может я чего-то не понимаю....
Здравствуйте, B0FEE664, Вы писали:

BFE>Немного удивившись такому решению, быстрым поиском нашёл похожее у MS здесь

BFE>Почему так сложно? Ведь задача решается в одну строчку:
BFE>
BFE>std::remove_if(numbers_in.begin(), numbers_in.end(), [](int& x){ const int s = x; x /= 2; return (s%2)==1; } );
BFE>

BFE>Или так нельзя?

Ну, во-первых, правильно выше подсказывают, здесь не хватает вызова erase. И если его добавить, то твоя строчка становится чуть длиннее:

   numbers_in.erase(std::remove_if(numbers_in.begin(), numbers_in.end(), [](int& x){ const int s = x; x /= 2; return (s%2)==1; } ), numbers_in.end());


Во-вторых, по условию задачи результат нужно было сложить в другой массив, а ты удаляешь прямо в исходном. Или ты собираешься сперва скопировать все содержимое, а потом уже удалять? Это вообще не спортивно.

Ну и в-третьих, а чем, в данном случае, хуже "лобовое" решение с использованием обычного цикла?

  for(int x : numbers_in) if (!x % 2) numbers_out.push_back(x / 2);