Std::reduce с лямбдой, возвращающей пару

@HTNW отметил в этом вопросе, что код операции использует std::reduce, если предоставленная лямбда была определена с большим количеством перегрузок. Может кто-нибудь привести пример реализации этой идеи?

Я нахожусь в практически идентичной ситуации и хотел бы воспользоваться преимуществами параллельных политик std::reduce вместо std::accumulate.

Я попытался создать 4 версии моей функции с каждым требуемым типом аргументов, но я не вижу, как передать все 4 из них в std::reduce. Я также пытался дать std::visit 4 лямбды, но это также не скомпилировалось.

Например, я не уверен, как компилировать следующий код:

#include <algorithm>
#include <execution>
#include <iostream>
#include <random>

#define N 100
#define seed 1

auto baz(std::pair<double,double> se, double vi){
  se.first  += vi;
  se.second *= 1+vi;
  return se;
}

auto baz(double vi, std::pair<double,double> se){
  return baz(se, vi);
}

auto baz(double vj, double vi){
  return std::pair(vi+vj,1.0);
}

auto baz(std::pair<double,double> se1, std::pair<double,double> se2){
  se1.first += se2.first;
  se1.second *= se2.second;
  return se1;
}

int main(){
  std::mt19937 rng(seed);
  std::uniform_real_distribution<double> dist(0,1);
  std::vector<double> v(N);

  std::for_each(std::execution::par_unseq, v.begin(), v.end(), [&dist,&rng](double& c){ c = dist(rng); });

  for(auto x : v)
    std::cout << x << ", ";
  std::cout << "\n";

  // working accumulate code
  auto foo = std::accumulate(v.begin(), v.end(), std::pair(0.0,1.0), 
      [](std::pair<double,double> se, double vi){
        se.first  += vi;
        se.second *= 1+vi;
        return se;
      });
  std::cout << foo.first << " " << foo.second << "\n";

  auto bar = std::reduce(v.begin(), v.end(), std::pair(0.0,1.0), baz)
  std::cout << bar.first << " " << bar.second << "\n";

}

Пожалуйста, покажите подробнее - ваши попытки.

kiner_shah 13.02.2023 07:06

Было бы здорово, если бы ваш вопрос был более самодостаточным.

bitmask 13.02.2023 08:55
Завернуть в лямбду.
Miles Budnek 15.02.2023 04:57
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
0
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно создать объект, который можно вызывать со всеми 4 указанными сигнатурами. Есть разные способы сделать это, но простой способ — использовать полиморфную лямбду:

[](auto x, auto y) { return baz(x, y); } 

Пример.

Другие вопросы по теме