51 votes

Multiplier les éléments vectoriels par une valeur scalaire à l'aide de STL

Salut, je veux (multiplier, ajouter, etc.) un vecteur par valeur scalaire, par exemple myv1 * 3 , je sais que je peux faire une fonction avec une boucle forcée , mais existe-t-il un moyen de le faire en utilisant la fonction STL? Quelque chose comme {Algorithm.h :: fonction de transformation } ?

97voto

Oli Charlesworth Points 148744

Oui, en utilisant std::transform :

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

Avant C++17, vous pouviez utiliser std::bind1st() , qui était obsolète en C++11.

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

Pour les espaces réservés ;

 #include <functional> 

28voto

Spandy Points 345

Solution C++ moderne pour votre question.

 std::vector<double> myarray;
double myconstant{3.3};
std::transform(myarray.begin(), myarray.end(), myarray.begin(), [&myconstant](auto& c){return c*myconstant;});

2voto

storluffarn Points 81

Je pense que for_each est très approprié lorsque vous souhaitez parcourir un vecteur et manipuler chaque élément selon un modèle, dans ce cas un simple lambda suffirait :

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

notez que toute variable que vous souhaitez capturer pour la fonction lambda à utiliser (disons que vous vouliez par exemple multiplier avec un scalaire prédéterminé), entre dans la parenthèse comme référence.

-1voto

slashmais Points 3924

Je sais que ce n'est pas STL comme vous le souhaitez, mais c'est quelque chose que vous pouvez adapter en fonction de différents besoins.

Vous trouverez ci-dessous un modèle que vous pouvez utiliser pour calculer ; 'func' serait la fonction que vous voulez faire : multiplier, ajouter, et ainsi de suite ; 'parm' est le deuxième paramètre de 'func'. Vous pouvez facilement étendre cela pour prendre différentes fonctions avec plus de paramètres de types variés.

 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 */

De plus, ce n'est pas une fonction "sûre", vous devez effectuer une vérification de type/valeur, etc. avant de l'utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X