IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

lambad expression std::for_each


Sujet :

C++

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut lambad expression std::for_each
    Salut,

    Peut-on arrêter un std::for_each :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		Data d;
    		std::for_each(map_rate[abo.GetCurrencyPair()].begin(),map_rate[abo.GetCurrencyPair()].end(),[&d,abo](const Data& data)
    		{
    			if(data.provider_ == abo.GetIdProvider())
    			{
    				d = data;
                                    //break; //un truc de ce style
    			}
    		}
    		);
    un return sort de for_each ou de la fonction englobant for_each ?
    merci

  2. #2
    la_tupac
    Invité(e)
    Par défaut
    Tu as essayé un continue ?

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Une lambda est censée être une fonction ; un return sort de la lambda, pas de la boucle dans laquelle est est appelée (idem pour un break).

    Ta seule solution, c'est de proposer une autre implémentation pour for_each.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Boucle tant que callee retourne true
    // dès que callee retourne faux, on stoppe le traitement. 
    template <class InIt, class Callable>
    InIt for_each_until(InIt first, InIt last, Callable callee)
    {
      InIt current(first);
      while (current != last)
      {
        if (!callee(*current)) break;
        ++current;
      }
    }
    Et du coup,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Data d;
     
    for_each_until(
    	map_rate[abo.GetCurrencyPair()].begin(),
    	map_rate[abo.GetCurrencyPair()].end(),
    	[&d,abo](const Data& data) -> bool
    	{
    		if(data.provider_ == abo.GetIdProvider())
    		{
    			d = data;
    			return false;
    		}
    		return true;
    	}
    );
    Ceci dit, l'algorithme que tu souhaite utiliser, c'est find_if, par for_each.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Data d;
    mon_conteneur<T>::iterator id = 
    	std::find_if(
    		map_rate[abo.GetCurrencyPair()].begin(),
    		map_rate[abo.GetCurrencyPair()].end(),
    		[&](const Data& d) // même pas besoin de return type, 
    		                   // le compilateur va trouver tout seul !
    		{ 
    			return data.provider_ == abo.GetIdProvider(); 
    		}
    	);
    if (id != map_rate[abo.GetCurrencyPair()].end())
    {
      d = *id;
    }
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/11/2012, 12h53
  2. Réponses: 5
    Dernier message: 13/07/2011, 19h56
  3. Améliorations de std::for_each avec les foncteurs
    Par Invité dans le forum Débuter
    Réponses: 15
    Dernier message: 13/05/2010, 13h46
  4. Réponses: 7
    Dernier message: 19/02/2010, 10h42
  5. [C++] std::for_each et this ?
    Par chronos dans le forum Langage
    Réponses: 14
    Dernier message: 11/08/2009, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo