Я новичок в C++ Читаю пример и наткрулся на такую конструкцию std::for_each и не понял, зачем она нужна когда есть стандартный for(val v : array)? Протестировал на время выполнения #include #include #include #include #include #include #include using namespace std using namespace std::chrono void testDeleteIt() { std::vector workers for (int i = 0 i < 1000000 ++i) { workers.push_back(i) } int count = 0 high_resolution_clock::time_point t1 = high_resolution_clock::now() for (int &i : workers) { count += i } __android_log_print(ANDROID_LOG_ERROR, "HERE", "HERE ::: %s", std::to_string(count).c_str()) count = 0 long long int duration = duration_cast(high_resolution_clock::now() - t1).count() __android_log_print(ANDROID_LOG_ERROR, "TIME1", "TIME 1::: %s", std::to_string(duration).c_str()) high_resolution_clock::time_point t2 = high_resolution_clock::now() std::for_each(workers.begin(), workers.end(), [&count](int &i) -> void { count += i }) count = 0 __android_log_print(ANDROID_LOG_ERROR, "HERE", "HERE ::: %s", std::to_string(count).c_str()) duration = duration_cast(high_resolution_clock::now() - t2).count() __android_log_print(ANDROID_LOG_ERROR, "TIME2", "TIME 2 ::: %s", std::to_string(duration).c_str()) } И получилось, что стандартный цикл выполныется почти в 2 раза быстрее TIME 1::: 10102 TIME 2 ::: 18459 И плюс в std::for_each еще и заморочки с лямбдой Так в чем тогда его преимущество?
Ответ Читаю пример и наткнулся на такую конструкцию std::for_each и не понял, зачем она нужна когда есть стандартный for(val v : array)? Все просто - std::for_each появился как минимум на 10 лет раньше. Поэтому, да, теперь есть стандартный for. Но Вы не единственный, кто задается таким вопросом. Но есть несколько особенностей. std::for_each умеет несколько дополнительных возможностей. std::for_each умеет работать с произвольным диапазоном, заданный двумя итераторами. Стандартный for умеет только begin-end. std::for_each можно перегрузить для своего типа и сделать цикл "быстрее" - потому что функция будет знать внутренности вашего типа. А ещё в 17 стандарт подвезли execution_policy. А это значит, что легким движением можно сделать for_each "многопоточным" и контейнер будет обрабатываться значительно быстрее. В ответе вы тестируете суммирование. Тогда используйте std::accumulate. У меня есть подозрение, что в первом случае компилятор разобрался, что Вы именно суммируете и просто заменил на формулу "суммы ряда". Clang так точно умеет. В этом случае сравнивать производительность двух циклов немного некорректно.