Necesitas usar un back_inserter:
std::copy(input.begin(), input.end(), std::back_inserter(output));
std::copyno agrega elementos al contenedor en el que está insertando: no puede; solo tiene un iterador en el contenedor. Debido a esto, si pasa un iterador de salida directamente std::copy, debe asegurarse de que apunte a un rango que sea al menos lo suficientemente grande como para contener el rango de entrada.
std::back_insertercrea un iterador de salida que llama push_backa un contenedor para cada elemento, por lo que cada elemento se inserta en el contenedor. Alternativamente, podría haber creado un número suficiente de elementos en el std::vectorpara mantener el rango que se copia:
std::vector<double> output(input.size());
std::copy(input.begin(), input.end(), output.begin());
O bien, puede usar el std::vectorconstructor de rango:
std::vector<double> output(input.begin(), input.end());
assign()función:output.assign(input.begin(), input.end());