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.

Obtener el valor proyectado de los algoritmos de std::ranges.

Estoy utilizando algoritmos de std::ranges (max y max_element) con una proyección.
¿Es posible que el resultado también sea el valor proyectado? Actualmente tengo que llamar nuevamente a la función de proyección en el valor devuelto.

Ejemplo:
Aquí quiero obtener el tamaño de la cadena más larga, pero los algoritmos solo devuelven la cadena o un iterador a ella.

int main()
{
    const std::vector<std::string> vec = {
        "foo",
        "hello",
        "esta es una cadena larga",
        "bar"
    };

    // r1 es una cadena. r2 es un iterador
    const auto r1 = std::ranges::max(vec, {}, &std::string::size);
    const auto r2 = std::ranges::max_element(vec, {}, &std::string::size);

    // Tengo que llamar a size() nuevamente
    std::cout << r1 << '\n' << *r2 << '\n';
    std::cout << r1.size() << '\n' << r2->size() << std::endl;
}

Compiler Explorer

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible hacer que el resultado también sea el valor proyectado con la ayuda de la función std::ranges::views::transform. Esta función crea una vista que aplica una función dada a los elementos del rango en el que opera, proyectándolos efectivamente según la función dada. Aquí hay un ejemplo actualizado que demuestra este enfoque:

    “`c++
    #include
    #include
    #include
    #include
    #include

    int main()
    {
    const std::vector vec = {
    “foo”,
    “hello”,
    “this is a long string”,
    “bar”
    };

    // Usando std::ranges::views::transform para proyectar los valores
    const auto size_proj = std::ranges::views::transform(vec, &std::string::size);
    
    const auto r1 = std::ranges::max(size_proj);
    const auto r2_it = std::ranges::max_element(size_proj);
    
    // Ahora r1 y r2_it contienen el tamaño de la cadena más larga,
    // sin necesidad de llamar a size() nuevamente
    std::cout << r1 << '\n' << *r2_it << '\n';
    

    }
    “`

    Compiler Explorer

Comments are closed.