Рассмотрим функцию шаблона, написанную на С++ 11, которая выполняет итерацию над контейнером. Пожалуйста, исключите из рассмотрения синтаксис цикла диапазона, потому что он еще не поддерживается компилятором, с которым я работаю.
template <typename Container>
void DoSomething(const Container& i_container)
{
// Option #1
for (auto it = std::begin(i_container); it != std::end(i_container); ++it)
{
// do something with *it
}
// Option #2
std::for_each(std::begin(i_container), std::end(i_container),
[] (typename Container::const_reference element)
{
// do something with element
});
}
Что такое за/против цикла for vs std::for_each
в терминах:
a) производительность? (Я не ожидаю никакой разницы)
b) читаемость и ремонтопригодность?
Здесь я вижу много недостатков for_each
. Он не принимал бы массив c-style, в то время как цикл был бы. Объявление формального параметра лямбда настолько подробное, что невозможно использовать auto
. Невозможно выйти из for_each
.
В пред-С++ 11 дней аргументам против for
требовалась спецификация типа для итератора (больше не держится) и простая возможность обмануть условие цикла (я никогда не делал таких ошибка через 10 лет).
Как вывод, мои мысли о for_each
противоречат общему мнению. Что мне здесь не хватает?