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

Langage C++ Discussion :

[exercice] contenu, contenant et conteneur


Sujet :

Langage C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut [exercice] contenu, contenant et conteneur
    Bonjour,

    c'est l'été, alors je vous propose un petit jeu.
    Dans le code qui suit, nous avons un conteneur, qui contient un tableau (vector). Nous voulons récupérer ce tableau pour y ajouter un élément.
    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
    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
     
    struct Container
    {
    	// constructeur
    	Container() : my_vector ( { 1, 2, 3 } ) {}
     
    	// accesseur au contenu qui renvoie un référence sur le vector (et non constante, pour qu'on puisse le modifier)
    	vector<int> & get_vector() { return my_vector; }
     
    private:
    	// le contenu
    	vector<int> my_vector;
    };
     
    int main()
    {
    	// on créé un conteneur
    	Container my_container;
     
    	// on récupère le contenu du conteneur
    	auto content_reference = my_container.get_vector();
     
    	// on a joute un élément à ce contenu
    	content_reference.push_back(4);
     
    	// on vérifie que l'élément a bien été ajouté
    	copy(my_container.get_vector().begin(), my_container.get_vector().end(), ostream_iterator<int>(cout, " "));
     
    	cout << endl;
    	getchar();
    	return 0;
    }
    Questions:
    Quel est l'output de ce programme?
    Pourquoi?

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    C'est assez vicieux ^^
    auto va être remplacé par std::vector<int> et non std::vector<int> &, et donc le 4 ne sera pas ajouter au vecteur de la structure (mais à la copie).

    Pour avoir le comportement attendu, il faut écrire auto & ou, en plus "barbare", decltype(my_container.get_vector()).

    PS : le code ne compile tel quel, il faut rajouter #include <iterator> pour std::ostream_iterator.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Ma réponse, faite sans compilateur, ni retour à la norme.
    Il sera affiché le contenu du vecteur interne. Ça, c'est certain, et sans piège.

    Reste le point de détail important: auto.
    auto content_reference = my_container.get_vector();.

    auto peut être qualifié de const ou de const&.
    Sauf que là, il est explicitement nourri par une référence.
    En typage, on a : auto = std::vector<int>&, j'espère sans certitude absolue que auto sera bien une référence.

    Si c'est le cas on aura 1 2 3 4, sinon, ce sera 1 2 3
    A présent, je ne suis pas fan du retour par référence modifiable d'une partie.
    Je préfèrerai en général créer des fonctions délégatrices, chaînables sur la classe englobante.
    Cela explique pourquoi je ne suis pas certain de mon analyse

    édit: j'en déduis qu'Ehonn est plus rapide que moi, et que mon gros doute était fondé.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    C'est assez vicieux ^^
    auto va être remplacé par std::vector<int> et non std::vector<int> &, et donc le 4 ne sera pas ajouter au vecteur de la structure (mais à la copie).

    Pour avoir le comportement attendu, il faut écrire auto & ou, en plus "barbare", decltype(my_container.get_vector()).
    Bien joué

    Au début j'étais parti sur un truc plus simple: int & get_number() /* ... */ auto = my_container.get_number(). Le problème est le même mais je trouvais que c'était trop facile alors j'ai rajouté l'histoire du vector, pour brouiller les pistes

    Citation Envoyé par Ehonn Voir le message
    PS : le code ne compile tel quel, il faut rajouter #include <iterator> pour std::ostream_iterator.
    Ha. Chez moi, sous visual 2013, ça compile comme ça. Bizarre

    edit: je viens de voir que dans la version de la STL de visual 2013, <iterator> est inclus dans <string>

  5. #5
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    ne compile pas avec g++ 4.9.1*
    C'est assez casse-pied les #include inclus par d'autres, la quasi-totalité des échecs de compilation de mes projets sous Clang viennent de là (je développe avec GCC mais teste de temps en temps avec Clang).

Discussions similaires

  1. [RegEx] recuperer un contenu contenant un mot x
    Par bigs3232 dans le forum Langage
    Réponses: 4
    Dernier message: 25/08/2010, 08h19
  2. Centrer le contenu d'un conteneur entre 2 autres conteneurs
    Par niavlys77 dans le forum Mise en page CSS
    Réponses: 28
    Dernier message: 22/04/2009, 09h02
  3. plusieurs fenetres contenues dans un conteneur
    Par jm49 dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 20/09/2008, 22h42
  4. [RegEx] Contenu contenant les délimiteurs
    Par ddelec24 dans le forum Langage
    Réponses: 6
    Dernier message: 26/08/2008, 12h59
  5. Un conteneur centré contenant 3 conteneurs différents
    Par the_clansman dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 10/11/2007, 07h18

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