visual studio microsoft espaƱol descargar community c++ stl

c++ - microsoft - visual studio installer



Forma de STL para agregar un valor constante a un std:: vector (5)

¿Hay un algoritmo en la biblioteca estándar que pueda agregar un valor a cada elemento de un std :: vector? Algo como

std::vector<double> myvec(5,0.); std::add_constant(myvec.begin(), myvec.end(), 1.);

que agrega el valor 1.0 a cada elemento?

Si no hay una buena manera (por ejemplo, corta, hermosa, fácil de leer) de hacer esto en STL, ¿qué tal un impulso?


Eche un vistazo a std::for_each y std::transform . Este último acepta tres iteradores (el comienzo y el final de una secuencia, y el inicio de la secuencia de salida) y un objeto de función. Hay un par de formas de escribir esto. Una forma, usando nada más que cosas estándar, es:

transform(myvec.begin(), myvec.end(), myvec.begin(), bind2nd(std::plus<double>(), 1.0));

También puede hacerlo con for_each , pero el comportamiento predeterminado de std::plus no devolverá la respuesta al vector original. En ese caso, debes escribir tu propio functor. El ejemplo simple sigue:

struct AddVal { double val; AddVal(double v) : val(v); void operator()(double &elem) const { elem += v; } }; std::for_each(myvec.begin(), myvec.end(), AddVal(1.0));


El camino más corto en C ++ 0X es:

for(double& d : myvec) d += 1.0;

y con impulso:

for_each(myvec, _1 += 1.0); // boost.range + boost.lambda


Incluso más corto usando funciones lambda, si usas C ++ 0x:

std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});


Si le interesa realizar muchas <valarray> matemáticas en vectores, le <valarray> parte <valarray> de la biblioteca estándar. Básicamente es un std::vector<> diseñado para cálculos numéricos vectoriales (sectores, funciones matemáticas, operadores de puntos, etc.).

La única parte que realmente apesta es que no tiene conversiones fáciles desde y hacia std::vector<> .


std::transform( myvec.begin(), myvec.end(), myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );