vectores resueltos programacion multiplicar matrices matematicas llenar elementos ejercicios ejemplos como arreglo c++ stl vector element operation

c++ - resueltos - Multiplica elementos vectoriales por un valor escalar usando STL



vectores y matrices en c++ (5)

Hola quiero vector (multiplicar, agregar, etc.) por valor escalar, por ejemplo myv1 * 3 , sé que puedo hacer una función con un bucle forloop, pero ¿hay alguna manera de hacerlo con la función STL? Algo como la {Algorithm.h :: transform function}?


Creo que for_each es muy apropiado cuando quieres atravesar un vector y manipular cada elemento de acuerdo con algún patrón, en este caso bastaría con una simple lambda:

std::for_each(myv1.begin(), mtv1.end(), [](int &el){el *= 3; });

tenga en cuenta que cualquier variable que quiera capturar para la función lambda (por ejemplo, quiere multiplicar con un escalar predeterminado), entra en el corchete como referencia.


Justo: si puede tener sus datos en una matriz de tamaño fijo (valores flotantes [N]), podría utilizar los valores intrínsecos de la SSE para hacerlo más rápido, ya que multiplicará la flotación semblante en un momento (4).


Sé que esto no es STL como quieres, pero es algo que puedes adaptar a medida que surgen las diferentes necesidades.

A continuación hay una plantilla que puede usar para calcular; ''func'' sería la función que desea hacer: multiplicar, agregar, y así sucesivamente; ''parm'' es el segundo parámetro del ''func''. Puedes extender esto fácilmente para tomar diferentes funciones con más parms de tipos variados.

template<typename _ITStart, typename _ITEnd, typename _Func , typename _Value > _ITStart xform(_ITStart its, _ITEnd ite, _Func func, _Value parm) { while (its != ite) { *its = func(*its, parm); its++; } return its; } ... int mul(int a, int b) { return a*b; } vector< int > v; xform(v.begin(), v.end(), mul, 3); /* will multiply each element of v by 3 */

Además, esta no es una función ''segura'', debe hacer una comprobación de tipo / valor, etc. antes de usarla.


Sí, usando std::transform :

std::transform(myv1.begin(), myv1.end(), myv1.begin(), std::bind(std::multiplies<T>(), std::placeholder::_1, 3));

Antes de C ++ 17, podía usar std::bind1st() , que estaba en desuso en C ++ 11.

std::transform(myv1.begin(), myv1.end(), myv1.begin(), std::bind1st(std::multiplies<T>(), 3));


Si puede usar un valarray lugar de un vector , tiene operadores integrados para hacer una multiplicación escalar.

v *= 3;

Si tiene que usar un vector , puede usar la transform para hacer el trabajo:

transform(v.begin(), v.end(), v.begin(), _1 * 3);

(suponiendo que tiene algo similar a Boost.Lambda que le permite crear fácilmente objetos de funciones anónimas como _1 * 3 :-P)