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.

“Boost transformó la conversión a vector con error.”

Soy un traductor de documentos de tecnología de la información. Traduzca lo siguiente al español. No traduzca el código ni la salida en markdown.

Soy nuevo en el uso de los adaptadores de boost, estoy utilizando el siguiente código para la conversión de un vector de una clase a una versión transformada.

El tipo de retorno de transformado de boost no es el esperado. ¿Alguien puede iluminar acerca de lo que me falta aquí?

class blabla
{
    public:
    int x;
};

class blabla2
{
    public:
    int  y;
    blabla2(int a)
    {
        y = a;
    }
}; 

int main()
{
    using namespace boost::adaptors;
    std::vector<blabla> test;

    auto foo = [](const blabla& A) -> std::pair<blabla2, double=""> {
    return std::make_pair(blabla2(A.x), double(A.x));
};

    const auto histogram = test | boost::adaptors::transformed(foo);
    //¿std::vector<><blabla2, double="">> debería ser el tipo de retorno?

    std::vector<><blabla2, double="">> histogramtest = histogram; ----> esta línea da un error inesperado. ¿Por qué sucede esto?
    std::pair<blabla2, double=""> x = histogram[0];
}

La línea <code>std::vector<>> histogramtest = histogram;</code> da un error.

Mientras que <code>std::pair x = histogram[0];</code> funciona correctamente. ¿Por qué sucede esto?</blabla2,></blabla2,></blabla2,></blabla2,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error en la línea std::vector<std::pair<blabla2, double>> histogramtest = histogram; se debe a que el tipo de retorno de la función transformada es un adaptador de rango, no un vector. El adaptador de rango es una vista en el rango original y no crea un nuevo contenedor. Por lo tanto, no se puede asignar directamente a un vector.

    Para convertir el adaptador de rango en un vector, se puede usar la función boost::copy_range:

    std::vector<std::pair<blabla2, double>> histogramtest;
    boost::copy_range(histogram, std::back_inserter(histogramtest));

    Esto copiará el contenido del rango en un nuevo vector, que se puede usar según sea necesario.

    Por otro lado, la línea std::pair<blabla2, double> x = histogram [0]; funciona correctamente porque accede a un solo elemento del adaptador de rango, que se puede convertir a un par directamente.

Comments are closed.