Comment utiliser std::for_each sur une carte de la méthode des éléments avec entrée?
J'ai:
struct Mystruct
{
void Update(float Delta);
}
typedef std::map<int, Mystruct*> TheMap;
typedef TheMap::iterator TheMapIt;
TheMap Container;
et veut faire:
for(TheMapIt It = Container.begin(), Ite = Container.end(); It != Ite; ++It)
{
It->second->Update(Delta);
}
à l'aide de std::for_each
, comment faire?
Je pense que je peux déclarer une fonction comme:
void Do(const std::pair<int, Mystruct*> Elem)
{
Elem->Update(/*problem!*/); ---> How to pass Delta in?
}
Ou faire une autre structure:
struct Doer
{
Doer(float Delta): d(Delta) {}
void operator(std::pair<int, Mystruct*> Elem)
{
Elem->Update(d);
}
}
Mais cela nécessite une nouvelle structure.
Ce que je souhaite réaliser est d'utiliser plaine std::for_each
avec quelque chose comme std::bind_1st
, std::mem_fun
comme la façon avec std::vector
, est-il possible?
Veuillez utiliser std
chemin avant d'utiliser boost
, merci!
J'ai référencé cela, mais il ne marche pas metion sur fonction membre avec entrée...
Comment puis-je utiliser for_each pour supprimer toutes les valeurs dans un STL carte?
OriginalL'auteur Marson Mao | 2012-12-26
Vous devez vous connecter pour publier un commentaire.
C'est juste un échange entre le style de codage, pour la boucle et for_each ne fait pas de grande différence, ci-dessous, deux autres approches en outre, pour la boucle:
Si vous utilisez C++11, pourrait tenter lambda:
Ou en C++03, vous pouvez ajouter une fonction membre d'une classe wrapper alors appel
std::bind1st
etstd::mem_fun
Écrire un foncteur n'est pas un mauvais choix, pourquoi vous êtes contre? Un foncteur offre une meilleure conception car il offre claire et propre but.
for_each 3ème argument est Unaire fonction qui signifie qu'il ne peut pas prendre d'argument supplémentaire. Vous pourriez ajouter une fonction membre de MapWrapper à la valeur définie de façon dynamique? voir ma réponse mis à jour.
J'irais avec
struct Doer
c'est un meilleur choix.Vous pouvez utiliser
std::bind1st
de traiter avec la fonction binaire, mais je viens de donw savoir comment prendre soin demap
élément, puisqu'il n'est pasvector
. Je sais comment utiliserstd::bind1st
sur(*it)->update(Delta)
, mais il est(*it).second->update(Delta)
maintenant. 🙁Je voudrais juste souligner que
TheMap
est un typename, et l'instance est nomméContainer
.OriginalL'auteur billz
Voulais juste souligner le lambda peut être écrit avec plus agréables de la syntaxe, qui vous ai déjà commencé en bas de cette route par la définition d'un typedef pour votre carte. La prochaine étape consiste à utiliser ValueType de sorte que vous n'avez pas de se rappeler que les éléments de la carte sont std::paires, et aussi pour éviter d'avoir à écrire les arguments de modèle.
Beaucoup plus facile à lire et vous permet de modifier certains détails, sans nécessairement avoir à propager ces modifications une tonne de différents endroits.
OriginalL'auteur obermeister