es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transformaciones de rango con lambdas con estado y std::views::drop.

Es la primera vez que me adentro en la nueva biblioteca <ranges> y he intentado un pequeño experimento combinando std::views::transform con una lambda de estado y ‘piping’ el rango resultante a std::views::drop:

“`c++
#include <iostream>
#include <ranges>
#include <vector>

using namespace std;

int main() {
auto aggregator = [sum = 0](int val) mutable
{
return sum += val;
};

<pre><code>vector<int> data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

cout << "Esperado:\n";
int sum = 0;
for (int val : data) {
cout << (sum += val) << ' ';
}
cout << '\n';

cout << "Transformación:\n- – – ";
for (int val : data | views::transform(aggregator) | views::drop(3)) {
cout << val << ' ';
}
cout << '\n';

return 0;
</code></pre>

}

<pre><code><br />La salida fue:
</code></pre>

Esperado:
1 3 6 10 15 21 28 36 45 55
Transformación:
– – – 4 9 15 22 30 39 49
“`

Ahora, la diferencia entre cada salida esperada y la actual es 1 + 2 + 3 = 6. Supongo que es el resultado de la evaluación perezosa de los rangos que hace que std::views::drop ignore las primeras tres transformaciones.

¿Existe alguna forma de forzar la evaluación del functor aggregator para los tres elementos que se omiten? ¿O se considera que las lambdas de estado y los rangos son incompatibles?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, la evaluación perezosa de los rangos hizo que std::views::drop ignorara las tres primeras transformaciones. Sin embargo, puedes forzar la evaluación convirtiendo el rango perezoso en un rango ansioso usando std::ranges::to_vector o std::ranges::to antes de aplicar std::views::drop. Esto hará que todas las transformaciones se evalúen antes de eliminar los elementos.

    Las lambdas con estado y los rangos no son incompatibles y se pueden utilizar juntos. Sin embargo, utilizar lambdas con estado en los rangos puede tener un comportamiento inesperado debido a la evaluación perezosa. Es importante entender cómo funciona la evaluación perezosa al utilizar lambdas con estado en los rangos.

Comments are closed.