DanielDemidko
@DanielDemidko
Программист

Как выполнить одну функцию для всех элементов вектора одновременно?

Есть vector<T> vec, функцияbool f(T).
Хочу выполнить функцию f для каждого элемента в vec, и сохранить все результаты вvector<bool> res;
Это можно сделать циклом
for(auto &i: vec)
{
    res.push_back(f(i));
}

Но я хочу распараллелить выполнение функции f для каждого элемента с помощью C++ threads/future
Функция f является чистой.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 2
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Вам уже написали выше, как это реализовать с помощью стандартной библиотеки (правда пока это ещё не часть стандарта, насколько мне известно).
В вашем случае, алгоритм будет такой:
1) Узнать число доступных потоков https://en.cppreference.com/w/cpp/thread/thread/ha...
2) Развить массив на столько частей, сколько у вас есть потоков
3) Написать функцию, которая принимает, скажем два итератора на часть массива, которую необходимо обработать, и два итератора на массив с результатами
4) Создать необходимое количество потоков https://en.cppreference.com/w/cpp/thread/thread/thread (число было получено в пункте 1) и запустить в них функции.
5) Дождаться результатов завершения: https://en.cppreference.com/w/cpp/thread/thread/join

Для этого можно использовать и std::async (https://en.cppreference.com/w/cpp/thread/async). Он возвращает std::future (https://en.cppreference.com/w/cpp/thread/future), на этом объекте необходимо будет ждать результатов вычисления.

Хотелось бы ещё отметить, что возможно не имеет смысла параллелить обработку небольших массивов, это только замедлит программу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
A3H Новосибирск
от 60 000 до 150 000 руб.
яРядом Краснодар
от 70 000 до 90 000 руб.
Mint Rocket Тюмень
До 85 000 руб.
22 янв. 2019, в 00:48
60 руб./за 1000 зн.
22 янв. 2019, в 00:09
120000 руб./в месяц
21 янв. 2019, в 23:37
1000 руб./за проект