map_reduce C ++ lamba: кандидат не подходит для одного аргумента - PullRequest
0 голосов
/ 16 апреля 2020

я написал небольшую прогу, чтобы заставить map / lower работать в C ++. здесь структура:

struct Point {
    int x = 0;
    int y = 0;
};

И я хочу выбрать «х» каждой точки и умножить их на целое число. Затем я хочу уменьшить значения с окончательной лямбой (или через std :: multiples)

std::vector<Point> p = {{10,20},{20,40}};
std::vector<int> p3 (p.size());

auto totalx = transform_reduce(p.begin(), p.end(),p3.begin(), 0.0, [](Point& p){ return p.x * 23;}, [](int a, int b){return a * b;});

cout << totalx << endl;

У меня есть эта ошибка:

main.cpp:28: candidate function not viable: requires single argument 'p', but 2 arguments were provided
conversion candidate of type 'int (*)(Point &)'

И я действительно не понимаю, что я сделал неправильно.

1 Ответ

3 голосов
/ 16 апреля 2020

Мне кажется, что вы хотите:

  1. Чтобы преобразовать все точки из (x, y) в x * 23
  2. , чтобы умножить все эти значения

В этом случае вы должны указать:

  1. Begin
  2. End
  3. Начальное значение (в случае умножения: 1,0, а не 0,0)
  4. Двоичная операция (std::multiplies<int>(), или [](int a, int b) {return a * b; }, для сокращения между элементами)
  5. Унарный оператор для сопоставления одного элемента (В вашем случае, [](const int number){return number*23;})

В целом:

auto totalx = std::transform_reduce(p.begin(), p.end(), 1.0, [](int a, int b) {return a * b; }, [](const Point& p) { return p.x * 23; });

Обратите внимание, что в итераторе вывода нет необходимости, поскольку имеется единственный результат.

...