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 :

retour multiple sur une lambda


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 56
    Points : 38
    Points
    38
    Par défaut retour multiple sur une lambda
    Bonjour,

    J'aimerais effectuer un test d'égalité sur deux valeurs dans une MAP.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #pragma once
     
    #include <string>
    #include <map>
    #include <vector>
    #include <algorithm>
     
    struct data
    {
    	int value;
    	std::string String;
    };
     
    struct header
    {
    	int v;
    	std::string s;
    };
     
    class example
    {
    	private:
    	header h_;
    	data d_;
    	std::map<header, std::vector<data>> container;
     
    	public:
    	example(const header& h, const data& d) : h_(h), d_(d) {}
     
    	void processing(const int v)
    	{
    		auto it = std::find_if(std::begin(container), std::end(container), [&](const header& h, const data& d) -> bool { return (h_.v == h.v && d_.value == d.value); });
    		if (it != std::end(container))
    		{
    			it->second.emplace_back(d_);
    		}
    		else 
    		{
    			container[h_].emplace_back(d_);
    		}
    	}
    };
    Je pense que les lambdas autorisent le retour multiple, à coup de surcharge de l'opérateur () et une bonne utilisation de std::pair/make_pair, non?

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A tout hasard, pourquoi une map de vector plutot qu'une multimap?

    Tu aimerais? C'est bien.

    Qu'entends tu par "les retours multiples"?
    Une fonction, fusse-t-elle membre d'une classe locale construite par le compilateur (c'est ainsi qu'est compilée une lambda) ne peut retourner qu'une seule chose.
    Attention, commes les règles sur les lambdas ont un peu changé entre C++11 et C++14 (puis C++17, à venir), précise-nous quelle est la version dont tu te sers.

    Quoiqu'il en soit, find_if attend une lambda qui prend un unique argument, du type des éléments itérés (ou idéalement, d'une référence constante dessus).
    En gros, find_if(it1, it2, lambda) n'est valable que si bool b = lambda(*it1); est valide.
    Ce n'est pas du tout le cas dans ton code.

    Pour le coup, comme tu fournis begin(container) comme itérateur, ton value_type est une pair<header const, std::vector<data>> const&.

    Et du coup, je ne comprends pas le lien entre ta question et ton code.

    J'ai l'impression que tu n'as pas saisi ce qu'est une lambda. Explique nous ce que c'est, qu'on te corrige si tu te trompes.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Où est ta lambda ?
    Où sont les multiples retours ?


    Ton test est inutile et l'opérateur [] de map crée l'élément s'il n'existe pas, tu devrais donc appeler container[h_].emplace_back(d_); dans tous les cas et basta.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Je n'ai vraiment pas bien exposé mon problème, c'est le cas de le dire ..

    Bon en fait, je suis parti dans le gros n'importe quoi d'anthologie. Le crash du compilateur était incompréhensible pour moi.
    Mon problème était que je plaçais une structure en tant que KEY dans une MAP et il n'aimait pas.

    Après recherche, on est obligé d'utiliser la surcharge de l'opérateur < comme dans l'exemple si contre:

    Je repose un nouveau code:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #pragma once
     
    #include <iostream>
    #include <map>
    #include <vector>
    #include <string>
    #include <algorithm>
     
    struct header
    {
    	int hvalue;
    	std::string hstring;
     
    	bool operator<(const header &h) const {
    		return hvalue < h.hvalue || (hvalue == h.hvalue && hstring.compare(h.hstring));
    	}
     
    };
     
    struct body
    {
    	int bvalue;
    	std::string bstring;
    };
     
    class basic
    {
    	private:
    	header header_;
    	body body_;
    	std::map<header, std::vector<body>> container;
     
    	public:
    	basic() = default;
    	basic(header& h, body& b) : header_(h), body_(b) {}
    	basic(const basic& c) = default;
    	basic(basic&& m) = default;
    	basic& operator=(const basic& o) = default;
    	~basic() = default;
     
    	void processing(int v) { container[header_].emplace_back(body_); }
    };
    PS: Je donne ce code à titre d'exemple. Les structures peuvent contenir 5 à 10 variables.
    On est obligé d'effectuer le test sur tous les attributs?

    Qu'en pensez-vous ?
    Est ce une bonne idée de procéder ainsi ?
    Merci.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Pour l'instant, un des moyens les plus simple pour comparer deux structures avec beaucoup de membre est de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return std::tie(s1.m1, s1.m2, s1.m3, s1.m4) < std::tie(s2.m1, s2.m2, s2.m3, s2.m4) ;
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par bowow Voir le message
    On est obligé d'effectuer le test sur tous les attributs?
    Y'a aucune obligation, tu fais le code qui doit être logiquement fait dans ton cas.
    Si ta structure a une variable de cache, y'a peu de chance qu'elle serve dans quelconque comparaison.
    Quant à utiliser une structure en clé de map, si ça a du sens, alors tu le fais. Si tu te poses la question, pourquoi avoir fait ça en premier lieu ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 469
    Points : 6 102
    Points
    6 102
    Par défaut
    Citation Envoyé par bowow Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct header
    {
    	int hvalue;
    	std::string hstring;
     
    	bool operator<(const header &h) const {
    		return hvalue < h.hvalue || (hvalue == h.hvalue && hstring.compare(h.hstring));
    	}
     
    };
    Attention ! Ta comparaison est mal implémentée.
    hstring.compare(h.hstring) ne renvoie pas true si hstring < h.hstring et false dans le cas contraire. Elle renvoie un entier selon la même logique que std::strcmp.
    Jette un œil à la doc de std::basic_string::compare.

Discussions similaires

  1. Retour mystique sur une requete SQL
    Par kael79 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/12/2007, 18h09
  2. Projection multiple sur une table
    Par Mister Nono dans le forum Hibernate
    Réponses: 2
    Dernier message: 20/09/2007, 13h21
  3. relations multiples sur une table
    Par lapuce dans le forum Modélisation
    Réponses: 2
    Dernier message: 18/07/2007, 17h58
  4. Choix multiple sur une listbox
    Par david71 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 10/07/2007, 16h35
  5. Retour arrière sur une iframe
    Par Bicnic dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2006, 16h34

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