Используя partial_sum(), я пытаюсь получить позицию из предыдущей во время повторения. Я не понимаю результат. Я ожидал получить:
recurrence i=0
recurrence i=1
...
По мере развития рецидива. Но я получаю:
recurrence i=-48115006
recurrence i=-48115006
...
Что я делаю неправильно?
#include <vector>
#include <algorithm>
#include <numeric>
#include <stdio.h>
using namespace std;
int main()
{
const int n=15;
vector<vector<int> > vv(n+1);
vv[0] = {42};
auto next=[&](const vector<int>& previous, const vector<int>&){
const int i = &previous - &vv[0];
printf("recurrence i=%d\n", i);
fflush(stdout);
vector<int> v;
return v;
};
partial_sum(vv.begin(), vv.end(), vv.begin(), next);
}
Вы хотели использовать второй параметр вашей лямбды вместо первого?
@Someprogrammerdude Ну, partial_sum нужна лямбда, чтобы вернуть что-то, что работает с 3-м параметром. Лучший вопрос, почему все это вместо iota или даже просто цикла for?





Реализация для partial_sum, которую вы используете, вероятно, похожа на описанную в cppreference, Возможная реализация, Вторая версия:
template<class InputIt, class OutputIt, class BinaryOperation>
constexpr // since C++20
OutputIt partial_sum(InputIt first, InputIt last,
OutputIt d_first, BinaryOperation op)
{
if (first == last)
return d_first;
typename std::iterator_traits<InputIt>::value_type sum = *first;
*d_first = sum;
while (++first != last)
{
sum = op(std::move(sum), *first); // std::move since C++20
*++d_first = sum;
}
return ++d_first;
}
В таком случае первым аргументом, который partial_sum передает op (бинарная операция, next в вашем коде), является fix: это ссылка на аккумулятор. Это второй аргумент, который меняется: это ссылка на текущий элемент в каждой итерации (начиная со второго элемента). Но в вашем примере вы не используете этот второй аргумент для установки i. Вместо этого вы всегда используете &vv[0], что также является фиксированным значением (если только vv не изменяется в размере, что не так). Поэтому ожидается, что вы всегда печатаете одно и то же значение: разницу двух адресов исправления.
Вы можете увидеть, как это работает здесь с некоторыми дополнительными выводами отладки.
Во-первых, зачем использовать небезопасную функцию
printfв программе на C++? Во-вторых, зачем возвращать пустой вектор из лямбда-функции?