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 } ?
Réponses
Trop de publicités?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>
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.
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.