std::transform à l'aide de C++0x expression lambda
Comment cela est possible en C++0x?
std::vector<double> myv1;
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
std::bind1st(std::multiplies<double>(),3));
Question d'origine et la solution est ici.
- ....a cette prise de ce post? stackoverflow.com/questions/3885095/...
- oui, je me suis lié à cette ci-dessus
- ah, ok. raté
- mon mauvais, c'était une modification dans l'intérêt de la divulgation complète
- Pourquoi ne pas simplement
for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; }
? - for_each ne pas modifier les éléments - j'ai essayé cette solution à l'original q - voir stackoverflow.com/questions/662845/...
- Townsend: Comme indiqué dans le fil de discussion lié,
for_each
est bien sûr autorisés pour modifier la non-const éléments de votre séquence de non-modification se réfère à la structure du conteneur qui nous laisser intact. - Vous devriez ajouter que comme une réponse. Je vais supprimer le mien.
- Merci - voici pour vous 😉
Vous devez vous connecter pour publier un commentaire.
-> double
est inutile; il est automatiquement déduite.std::transform(myv1.begin(), myv1.end(),myv1.begin(),myv1.end(), std::bind(std::multiplies<double>(),_1,3));
Il suffit de faire comme Dario dit:
for_each
est autorisé à modifier les éléments, en disant qu'il ne peut pas est un mythe.La principale motivation initiale pour l'utilisation fonctionnelle de style pour ces cas en C++ a été, "aaagh! itérateur de la boucle!", et C++0x supprime que la motivation avec la gamme de base pour la déclaration. Je sais qu'une partie de la point de la question était de savoir le lambda de la syntaxe, mais je pense que la réponse à la question "Comment est-ce fait dans C++0x?" est:
Il n'y a pas de réelle fonction d'objet, mais si ça vous aide pourrait prétendre que
{ a *= 3; }
est un très abrégée lambda. Pour l'ergonomie, il revient à la même chose de toute façon, même si le projet de norme définit basés sur la plage, pour un équivalentfor
boucle.À l'aide d'une mutable approche, nous pouvons utiliser
for_each
directement mettre à jour les éléments de la séquence par le biais de références.Il y a eu un débat passe si
for_each
est en fait autorisés à modifier des éléments comme on les appelle les "non-mutation" de l'algorithme.Ce que cela signifie est
for_each
n'est pas autorisé à modifier le séquence il opère sur (qui se réfère à des changements de la séquence structure - c'est à dire d'invalider les itérateurs). Cela ne veut pas dire nous ne pouvons pas modifier la non-const éléments du vecteur comme d'habitude - la structure elle-même est épargnée par ces opérations.Comme ceci:
Je suis en utilisant VS2012 qui soutiennent le C++11 lier adaptateur. Pour lier le premier élément de la fonction binaire (comme bind1st utiliser pour le faire), vous devez ajouter une
_1 (espace réservé à l'argument). Besoin d'inclure la fonctionnelle pour lier.