L'appel d'une fonction sur chaque élément de C++ vecteur
En C++, est-il possible d'appeler une fonction sur chaque élément d'un vecteur, sans l'aide d'une boucle sur tous les éléments du vecteur? Quelque chose de semblable à une "carte" en Python.
Vous devez vous connecter pour publier un commentaire.
Oui:
std::for_each
.for_each()
est probablement une boucle tout de même et comme il utilise des modèles, il devrait y avoir aucune différence. Cependant, avec le C++17, ils peuvent introduire du parallélisme qui serait totalement transparent pour vous et il pourrait très bien commencer le plus vite.Vous avez déjà obtenu plusieurs réponses mentionnant
std::for_each
.Bien que ces répondre à la question que vous avez posée, je voudrais ajouter que, au moins dans mon expérience,
std::for_each
est sur le moins utile de les algorithmes standards.- Je utiliser (pour un exemple)
std::transform
, qui est essentiellementa[i] = f(b[i]);
ouresult[i] = f(a[i], b[i]);
beaucoup plus fréquemment que lesstd::for_each
. De nombreuses personnes utilisent fréquemmentstd::for_each
pour imprimer les éléments d'une collection; à cette fin,std::copy
avec unstd::ostream_iterator
comme destination fonctionne beaucoup mieux.transform
est plus proche de Pythonmap
quefor_each
est, depuismap
génère une liste de résultats, alors quefor_each
appelle une fonction, mais supprime les sorties.Sur le C++ 11: Vous pouvez utiliser une lambda. Par exemple:
ref: http://en.cppreference.com/w/cpp/algorithm/for_each
Utilisation
for_each
:Si vous avez le C++11, il y a un encore plus courte méthode: varié à base de. Son but est exactement ce.
Vous pouvez également demander des références et const ainsi, le cas échéant, ou de l'utilisation de l'auto lorsque le type est longue.
De sortie:
operator<<(std::cout, element)
. Mon objectif principal avec le post a été l'ouverture de l'OP (et à tous les futurs visiteurs de cette syntaxe. La raison de ne pas vouloir en boucle n'a pas été indiqué et pourrait tout aussi bien avoir été de ne pas vouloir taper tout. Il y a une boucle présents dansfor_each
ainsi. Le deuxième exemple n'est qu'un exemple. Cela montre que vous pouvez utiliser l'une ou l', ce qui laisse les gens libres de le modifier comme ils le souhaitent. D'ailleurs, qui a dit que vous avez besoin de l'élément à être modifiable pour appeler une fonction sur elle?Vous pouvez utiliser std::for_each qui prend une paire d'itérateurs et d'une fonction ou d'un foncteur.
L'OP mentionne le
map
fonction en Python.Cette fonction applique une fonction à chaque élément d'une liste (ou un objet iterable)
et retourne une liste (ou un objet iterable) qui recueille tous les résultats.
En d'autres termes, il fait quelque chose comme ceci:
Par conséquent, le plus proche du C++ standard library équivalent en Python de la carte est en fait
std::transform
(à partir de l'en-tête").Exemple d'utilisation est la suivante: