Комментарии 6
Добрый день! По поводу примера 1 из раздела 5 - как то у Вас сложно получилось 😊. Вот так проще будет😊:
std::string convert1(const char buffer[15])
{
std::array positions{ 3, 5, 7, 9 };
std::string result{ buffer };
for (auto pos : positions)
result[pos] = '-';
return result;
}
А по поводу: «Для данного примера нет алгоритмов, которые смогли бы решить данную задачу» - ну почему же, вполне можно😊:
std::string convert2(const char buffer[15])
{
std::unordered_set positions{ 3, 5, 7, 9 };
std::string result{ buffer };
std::replace_if(result.begin(),
result.end(),
[=, i = 0](auto elem) mutable {return positions.contains(i++);},
'-');
return result;
}
Ну и соответственно для рэнжей решение можно написать гораздо проще😊:
std::string convert3(const char buffer[15])
{
std::unordered_set positions{ 3, 5, 7, 9 };
std::string result{ buffer };
std::ranges::replace_if(result,
[=, i = 0](auto elem) mutable {return positions.contains(i++); },
'-');
return result;
}
"x=" + std::to_string(it.x) + " y=" + std::to_string(it.y);
std::format
, не?
std::ranges::views::transform([](auto item) {return convert(item); })
зачем convert
оборачивать в лямбду?
Ну и отдельный привет рэнжам - то есть view алгоритмы вас устраивают, а рэнжи нет? Их же в первую очередь придумали чтобы не писать begin
-end
и превращать все вот эти ваши
std::transform(temp.cbegin(), temp.cend(), std::back_inserter(str), [](auto item) { return convert(item); });
во что-то вроде
std::ranges::transform(temp, std::back_inserter(str), convert);
нельзя распараллелить вычисления;
используйте std::execution_policy::par и будет вам счастье. Упрощение оптимизаций для компилятора - вторая из мажорных причин существования рэнжовых алгоритмов.
Спасибо, что поделились! Никто не запрещает использовать любые удобные для вас методы. Автор рассказал о своем личном опыте, который может кому-то помочь и упростить его код.
Возможности С++: от стандартных алгоритмов до диапазонов (Ranges)