Выбор между std::generate() и std::for_each()

145
02 июля 2022, 20:20

Помогите выбрать реализацию метода из двух вариантов - calc1() и calc2():

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <execution>
class Test
{
public:
    Test() {};
    ~Test() {};
    void add_eq(std::function<double(void)> f)
    {
        _equations.push_back(f);
    }
    // version 1
    std::vector<double>& calc1()
    {
        _v.resize(_equations.size());
        std::generate(
            std::execution::par,
            _v.begin(), _v.end(),
            [this, n = 0]() mutable
        {
            return _equations[n++](); 
        }
        );
        return _v;
    }
    // version 2
    std::vector<double>& calc2()
    {
        std::vector<int> inds(_equations.size());
        std::iota(inds.begin(), inds.end(), 0);
        _v.resize(_equations.size());
        std::for_each(
            std::execution::par,
            inds.begin(), inds.end(),
            [this](const int& n)
            {
                _v[n] = _equations[n]();
            }
        );
        return _v;
    }
private:
    std::vector<std::function<double(void)>> _equations{};
    std::vector<double> _v{};
};

Оба ли варианта имеют право на жизнь (учитывая использование std::execution::par)? И какой вариант более предпочтителен? Меня смущают оба варианта, поэтому и решил посоветоваться.

Answer 1

Тут больше std::transform подойдёт

_v.resize(_equations.size());
std::transform(
    std::execution::par, 
    _equations.begin(), _equations.end(), 
    _v.begin(),
    [](const auto& f) { return f(); }
);
READ ALSO
Чтение файла и отправка по tcp

Чтение файла и отправка по tcp

Идея какая, я открываю файл и считываю его построчно, каждую строку я конвертирую в char вывожу на экран и отправляю при помощи send() на tcp серверФайл...

184
IPS Forum, Регистрация не в стандартную базу

IPS Forum, Регистрация не в стандартную базу

В стандарте при регистрации пользователя записывает логин пасс в MySql базу а пароль еще и шифрует, нужно сделать регистрацию в отдельную MySql базу,...

211
как реализовать оповещение клиентов об окончании оплаченного периода ? на php. Вывод в телеграм бот

как реализовать оповещение клиентов об окончании оплаченного периода ? на php. Вывод в телеграм бот

не приходит в голову данная реализация, мне надо оповестить за день клиента что у него заканивается оплачиваемый период(на неделю, две недели

187
Как вытянуть из строки только цифры?

Как вытянуть из строки только цифры?

Есть строки вида 'abc 72', 'cdi 8', 'bagi 993' и тд

183