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

Boost C++ Discussion :

[Graph] Mettre de propriétés sur ses vertex


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut [Graph] Mettre de propriétés sur ses vertex
    Bonsoir,

    Je débute complètement Boost ( j'ai commencé a y toucher avant-hier), je suis un peu perdu dans tout ces concepts de graph mais bon, je fais avec.

    Mon objectif est de créer un graph de type undirected avec des vertex comportant plusieurs propriétés.

    J'ai commencé par faire un truc qui marche : un pays possède un nom ( en String)

    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
     
    #include <boost/config.hpp>
    #include <iostream>
    #include <boost/graph/adjacency_list.hpp>
    #include <boost\property_map\property_map.hpp>
    using namespace std;
    using namespace boost;
     
    struct name_tag { 
    	typedef vertex_property_tag kind;
    };
    typedef boost::property<name_tag,std::string> NameProperty;
     
    typedef boost::adjacency_list<boost::listS,boost::vecS,boost::undirectedS,NameProperty> Graph;
     
    int main(){
    	Graph g;
    	property_map<Graph,name_tag>::type
    		name = get(name_tag(), g);
     
    	boost::graph_traits < Graph >::vertex_descriptor A, B, C, D;
     
     
    	A = boost::vertex(0,g);
    	B = boost::vertex(1,g);
    	C = boost::vertex(2,g);
    	D = boost::vertex(3,g);
     
    	boost::add_edge(A, B, g);
    	boost::add_edge(B, C, g);
    	boost::add_edge(C, D, g);
    	boost::add_edge(D, A, g);
     
    	boost:put(name,A,"France");
    	name[B] = "Mongolie";
    	name[C] = "Zanzibar";
    	name[D] = "Costa Rica";
     
    	cout << name[C];
    	cin >> name[D];
    	return 0;
    Mais, étant de nature exigeante je veux un nom ET une population, j'ai encapsulé le tout dans une class, ça m'a semblé tout naturel mais mon compilateur ne possède pas le même point de vue.
    Voila ce que j'ai écrit :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <boost/config.hpp>
    #include <iostream>
    #include <boost/graph/adjacency_list.hpp>
    #include <boost\property_map\property_map.hpp>
     
     
    using namespace std;
    using namespace boost;
     
    class pays{
    	public:
    	string nom;
    	int population;
    	pays(string nom_E,int population_E): nom(nom_E) , population(population_E) {}
    };
     
    struct pays_tag { 
    	typedef vertex_property_tag kind;
    };
    typedef boost::property<pays_tag,pays> PaysProperty;
     
    typedef boost::adjacency_list<boost::listS,boost::vecS,boost::undirectedS,PaysProperty> Graph;
     
     
    int main(){
    	pays France("France",42);
     
    	Graph g;
    	property_map<Graph,pays_tag>::type
    		pays = get(pays_tag(), g);
     
    	boost::graph_traits < Graph >::vertex_descriptor A, B, C, D;
     
     
    	A = boost::vertex(0,g);
    	B = boost::vertex(1,g);
    	C = boost::vertex(2,g);
    	D = boost::vertex(3,g);
     
    	boost::add_edge(A, B, g);
    	boost::add_edge(B, C, g);
    	boost::add_edge(C, D, g);
    	boost::add_edge(D, A, g);
     
    	pays[0]= France;
     
    	cout << pays[0].nom << "\t" << pays[0].population;
     
    	return 0;
     
    }
    Experts en Boost, auriez vous des réponses à ce problème ?
    Merci d'avance et bonne soirée !

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    La value d'une property doit être default-constructible.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    Il faut ajouter des instructions du côté de PaysProperty et faut avoir une propertyMap tagguée comme Writable et Readable ?

    J'ai continué de tâtonner et j'ai rien trouvé de conséquent ( et rien en rapport avec de la default-constructibilité)

    Ce que je n'arrive pas à conprendre c'est pourquoi il y aurait un code différent si l'on utilise une class ( et donc un type personnalisé en quelque sorte ) au lieu d'un type par défaut

    J'ai trouvé cela :
    property()

    Construct a property object with member m_value a default constructed instance of type T and with the super object default constructed. Note that T must be Default Constructible for this property, and all the inherited property types.
    Mais ça ne solutionne pas grand chose

    Edit : Il faut un constructeur par défaut
    Ça a mis du temps à faire le tour mais c'est BON ça MARCHE

    Ta courte réponse m'a dérouté au début mais au moins tu m'a pas spoilé tout le truc

    Maintenant il me reste plus qu'a comprendre comment lister ou obtenir une liste des edges connectés à un vertex


    Merci bien !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Mettre un userform et ses controls sur tout l'écran
    Par joums dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 23/08/2010, 17h12
  2. mettre les effectifs sur les barres d'un graphe en pile
    Par cocotta dans le forum SAS Base
    Réponses: 0
    Dernier message: 11/05/2010, 10h27
  3. Réponses: 0
    Dernier message: 05/05/2010, 19h55
  4. UserControl: Pourquoi le Binding sur ses propres propriétés ne fonctionne pas ?
    Par Chekov dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 07/10/2009, 22h08
  5. Réponses: 2
    Dernier message: 07/06/2007, 12h49

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