Сообщение Может я чего-то не понимаю.... от 25.07.2023 22:15
Изменено 26.07.2023 10:01 B0FEE664
Может я чего-то не понимаю....
Знакомясь с возможностями C++20 наткнулся на статью здесь
Предлагается решить задачу:
Немного удивившись такому решению, быстрым поиском нашёл похожее у MS здесь
Почему так сложно? Ведь задача решается в одну строчку:
Или так нельзя?
Предлагается решить задачу:
Допустим, есть вектор с целыми числами, и требуется поделить все его числа на два. Те, которые не делятся, нужно просто выкинуть. Это несложно написать циклом, но для выразительности воспользуемся алгоритмами:
std:vector<int> numbers_in;
std:vector<int> numbers_out;
// задача: поделить на 2 все чётные числа из numbers_in
// и записать результаты numbers_out
std:vector<int> intermediate;
// скопируем в intermediate только чётные числа
std::copy_if(numbers_in.begin(), numbers_in.end(),
std::back_inserter(intermediate),
[](int x) {
return x % 2 == 0;
}
);
// поделим их на 2
std::transform(intermediate.begin(), intermediate.end(),
std::back_inserter(numbers_out),
[](int x) {
return x / 2;
}
)
Немного удивившись такому решению, быстрым поиском нашёл похожее у MS здесь
Почему так сложно? Ведь задача решается в одну строчку:
std::remove_if(numbers_in.begin(), numbers_in.end(), [](int& x){ const int s = x; x /= 2; return (s%2)==1; } );
Или так нельзя?
Может я чего-то не понимаю....
Знакомясь с возможностями C++20 наткнулся на статью здесь
Предлагается решить задачу:
Немного удивившись такому решению, быстрым поиском нашёл похожее у MS здесь
Почему так сложно? Ведь задача решается в одну строчку:
Исправление (забыл отрезать хвост):
Или так нельзя?
Предлагается решить задачу:
Допустим, есть вектор с целыми числами, и требуется поделить все его числа на два. Те, которые не делятся, нужно просто выкинуть. Это несложно написать циклом, но для выразительности воспользуемся алгоритмами:
std:vector<int> numbers_in;
std:vector<int> numbers_out;
// задача: поделить на 2 все чётные числа из numbers_in
// и записать результаты numbers_out
std:vector<int> intermediate;
// скопируем в intermediate только чётные числа
std::copy_if(numbers_in.begin(), numbers_in.end(),
std::back_inserter(intermediate),
[](int x) {
return x % 2 == 0;
}
);
// поделим их на 2
std::transform(intermediate.begin(), intermediate.end(),
std::back_inserter(numbers_out),
[](int x) {
return x / 2;
}
)
Немного удивившись такому решению, быстрым поиском нашёл похожее у MS здесь
Почему так сложно? Ведь задача решается в одну строчку:
std::remove_if(numbers_in.begin(), numbers_in.end(), [](int& x){ const int s = x; x /= 2; return (s%2)==1; } );
Исправление (забыл отрезать хвост):
v.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());
Или так нельзя?