Раньше я не любил std::for_each
и думал, что без лямбды это было сделано совершенно неправильно.Однако некоторое время назад я передумал, и теперь мне это действительно нравится.И я думаю, что это даже улучшает читабельность и облегчает тестирование вашего кода TDD.
Алгоритм std::for_each
можно прочитать как что-то сделать со всеми элементами в диапазоне ,который может улучшить читаемость.Скажем, действие, которое вы хотите выполнить, имеет длину 20 строк, а функция, где выполняется действие, также имеет длину около 20 строк.Это сделало бы функцию длиной в 40 строк с обычным циклом for и только около 20 с std::for_each
, что, вероятно, облегчило бы понимание.
Функторы для std::for_each
более вероятно будут более универсальными, и, таким образом,многоразового использования, например:
struct DeleteElement
{
template <typename T>
void operator()(const T *ptr)
{
delete ptr;
}
};
И в коде у вас будет только одна строка, такая как std::for_each(v.begin(), v.end(), DeleteElement())
, что немного лучше IMO, чем явный цикл.
Все эти функторыкак правило, легче проходить юнит-тесты, чем явный цикл for в середине длинной функции, и это само по себе уже большая победа для меня.
std::for_each
также, как правило, более надежно, поскольку вы 'менее вероятно ошибиться с помощью range.
И, наконец, компилятор может выдавать немного лучший код для std::for_each
, чем для определенных типов созданного вручную цикла for, поскольку он (for_each) всегда выглядит одинаково для компилятора, и авторы компилятора могут использовать все свои знания, чтобы сделать их настолько хорошими, насколько они могут.
То же самое относится к другим алгоритмам std, таким как find_if
, transform
и т. Д.