Bonjour,
je poursuis mon exploration de parties de la STL que j'avais jusqu'à présent hélas négligé : les algorithmes, et notamment, pour le cas qui nous intéresse, std::for_each et std::transform
Je pense avoir correctement saisi leur fonctionnement dans plusieurs cas de figures, mais bien évidemment, je n'y suis pas encore parvenu pour le mien 
Je dispose d'une classe qui a, comme variable interne :
std::map<unsigned int, Parcours_Utilisateur> m_m_Etat_Parcours_Utilisateur;
Dans une des fonctions membre de cette classe, je souhaite parcourir cette std::map, pour, en fonction d'un paramètre connu de cette seule fonction, y apporter d'éventuelles modifications. À ce jour, j'ai ça :
1 2 3 4 5
| bool ConnecteurClientImpl::supprime_Client_Connecte(int i_Identifiant_Client)
{
std::list<int> l_Temporaire(m_m_Etat_Parcours_Utilisateur.size(), i_Identifiant_Client );
std::transform(m_m_Etat_Parcours_Utilisateur.begin(), m_m_Etat_Parcours_Utilisateur.end(), l_Temporaire.begin(), m_m_Etat_Parcours_Utilisateur.begin(), action_Sur_Suppression_Client());
} |
Ce code ne passe pas à la compilation car il semblerait qu'il n'accepte pas un itérateur sur un std::pair pour l'itérateur dans lequel il doit écrire les résultats. D'où ma première question : est-ce possible ?
Le second point qui ne me satisfait pas, c'est que afin de pouvoir communiquer à la fonction passée en paramètre de l'algorithme le paramètre i_Identifiant_Client, je n'ai pas trouvé mieux que de créer une liste et de la passer en tant que second itérateur de parcours pour le second paramètre de la fonction appelée. Y avait-il moyen de faire mieux ou plus élégants pour que la fonction action_Sur_Suppression_Client() puisse connaître i_Identifiant_Client ?
Troisième point : cette fonction est aujourd'hui définie comme une fonction objet. Pourquoi pas, sauf que j'aurais préféré en faire une fonction membre de la classe ConnecteurClientImpl. Est-ce possible ?*Toutes mes tentatives ont été vaines, mais peut-être est-ce dû à mon manque de maîtrise des pointeurs de fonction et approchants …. Je n'y suis parvenu que si la fonction était statique, ce que je ne désire pas.
Enfin, quatrième et dernier point : les différences entre for_each et transform ne sont pas toujours évidentes et ce que j'ai pu lire suite à mes recherches est contradictoire : il est affirmé dans une de mes lectures que for_each peut appeler des fonctions à effet de bord, alors que transform ne doit pas.
Dans les cours C++, c'est quasi l'inverse qui y est expliqué : for_each ne doit en aucun cas modifier le contenu des itérateurs qu'il parcourt alors que transform, si.
Lequel a raison ? Ou bien c'est moi qui ai mal compris le terme « side effect » du premier article qui est en anglais …
Merci une nouvelle fois à ceux qui pourront m'apporter leurs lumière à ma compréhension incomplète.
Partager