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 :

Question d'entretien sur les itérateurs


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Question d'entretien sur les itérateurs
    Bonjour

    J'ai eu comme question en entretien la question suivante:

    considérons un itérateur iter sur un vecteur par exemple.

    Quelle est la différence entre iter++ et ++iter?
    Que vaut-il mieux faire entre les deux cas ?

    Je n'ai pas su répondre. Alors comme c'est une question qui revient souvent, j'aimerais bien savoir quoi dire.



    Merci

  2. #2
    Membre chevronné
    Avatar de myzu69
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 220
    Par défaut
    Bonjour,

    la différence est celle qu'il y a entre la pré et la post incrémentation. J'avais lu quelque part que les compilos optimisaient pareil pour les types de base (int, ...) mais avaient plus de mal pour des types plus complexes comme les itérateurs.

    Lorsque l'on fait une post-incrémentation, il y a une copie de la variable qui est faite, alors que pas en pré-incrémentation. Donc dans ce cas je pense qu'il faut plutôt faire ++iter.

    Voilà, je ne suis pas sûr à 100% de ce que j'avance, je vais essayer de retrouver l'article ...

    EDIT : ha ben en fait y'a un article dans la FAQ : http://cpp.developpez.com/faq/cpp/?p...GE_rapidite_pp
    La différence ne semble pas énorme ...

    Ha oui et ce serait possible d'avoir le nom de la boite où tu as passé l'entretien ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut
    Bonjour,

    A vrai dire un i++ ou ++i sont équivalents si le résultat n'est pas utilisé. Après un ++i va permettre éventuellement d'économiser un peu de mémoire car on n'a plus besoin de stocker la valeur de i (itérateur ou entier même combat).
    Apres c'est peut etre un peu HS pour ce thread mais la FAQ m'a fait réagir.. ++i n'est pas toujours supérieur à i++ ! Mais à vrai dire je pense qu'il n'y à qu'un cas où c'est faux : array[++i] et array[i++]. Le premier cas (i++) ne peut etre que plus efficace car le calcul de l'adresse du tableau n'a pas besoin d'attendre celle de i.

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Idwakest Voir le message
    Mais à vrai dire je pense qu'il n'y à qu'un cas où c'est faux : array[++i] et array[i++]. Le premier cas (i++) ne peut etre que plus efficace car le calcul de l'adresse du tableau n'a pas besoin d'attendre celle de i.
    Dans ce cas, chercher le plus rapide n'a que peu de sens puisque le comportement n'est pas le même dans les deux cas.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut
    Citation Envoyé par gl Voir le message
    Dans ce cas, chercher le plus rapide n'a que peu de sens puisque le comportement n'est pas le même dans les deux cas.
    Et en décalant l'indice de 1 dans une boucle par exemple ??

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Idwakest Voir le message
    Et en décalant l'indice de 1 dans une boucle par exemple ??
    Pardon ? Peux-tu préciser ce que tu entends par là ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut
    Je sais bien que cela a bien peu d'intérêt au final (voire même aucun) mais ce que je voulais dire c'est qu'au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = -1; i < val;) array[++i] = 42;
    on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < val + 1;) array[i++] = 42;
    Au final ces 2 boucles produisent le même résultat.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Au final, en mode release, avec un bon compilateur, cette boucle sera sauvagement optimisée et il n'y aura aucune différence.

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,
    Citation Envoyé par 3DArchi Voir le message
    Au final, en mode release, avec un bon compilateur, cette boucle sera sauvagement optimisée et il n'y aura aucune différence.
    Tout à fait, mais, suis-je le seul à considérer le fait de ne pas donner la troisième expression (celle du pas) dans une boucle for comme une hérésie

    Après tout, il est tout à fait possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0;i<val;++i)array[i]=/*...*/ ;
    Et Ce n'est pas vraiment pour le temps que prend l'écriture d'un caractère en plus (le i rajouté entre les crochets) qui fera prendre un retard insurmontable au projet

    Il ne faut pas oublier que le but même de la boucle for est de fournir un "compteur" avec une borne de départ, une borne de fin, et un pas tendant à relier les deux

    Je sais que même stroutroup conseille volontiers les boucles proches de
    mais je ne suis vraiment pas de son avis sur ce coup là
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par koala01 Voir le message
    suis-je le seul à considérer le fait de ne pas donner la troisième expression (celle du pas) dans une boucle for comme une hérésie
    Disons, que boucler de [-1;val[ ou de [0;val+1[, je trouve déjà ça discutable ([0;len[ est plus 'usuel'). Idwakest a donné cet exemple maladroit mais je pense qu'il cherchait un exemple où ça aurait eu un intérêt. Et comme dit gl, ou ça n'a pas d'intérêt, ou ça fait la même chose.

  11. #11
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    pour expliquer mon post, on m'a posé cette question:
    vaut il mieux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vector<double> T(3);
    iterator<double> it;
     
    for(it=T.begin();it<=T.end();it++){...}
    ou:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vector<double> T(3);
    iterator<double> it;
     
    for(it=T.begin();it<=T.end();++it){...}
    j'avoue je ne sais pas la différence

  12. #12
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    un peu comme il a été dit plus haut cela ne change pas grand chose a partir du moment ou le résultât de la pre/post incrémentation n'est pas utilisé

    par contre le test <= est très bizarre car lorsque end est atteint on est en dehors du vecteur
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 29
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    par contre le test <= est très bizarre car lorsque end est atteint on est en dehors du vecteur
    Pareil. J'ai plus tendance à utiliser != pour ce test personnellement

  14. #14
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Le mec que j'ai eu en entretien m'a dit que si on faisait ++it,
    dans la boucle for que j'ai donnée, le risque était donc de louper le premier élément.

    Cela m'a un peu embrouillé. C'est ce qu'il se passe d'ailleurs quand on est dans un entretien et que l'on a affaire à un mec qui ne s'y connait pas vraiment en profondeur.

    Autre exemple:
    Dans cet entretien, je suis tombé sur le code suivant qu'il m' a donné.
    J'ai essayé de lui expliquer que faire qqch comme cela:

    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
     
    class A{
    private:
    int a;
    public:
    void afficher(){
    cout<"...",}
    };
     
    class B:public A{
    private:
    int b;
    public:
    void afficher(){
    cout<"...",}
    };
    c'était pas bien, car on va redéfinir une fonction non virtuelle, et violer la relation "EST UN".

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 29
    Par défaut
    Citation Envoyé par myzu69 Voir le message
    Ha oui et ce serait possible d'avoir le nom de la boite où tu as passé l'entretien ?
    Hum, je plussoie la question là. C'est choquant le truc de l'itérateur :o

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    oui, qu'on y aille pas par erreur.

    non mais n'importe quoi, le mec qui pose une question un peu idiote et qui se trompe dans la réponse.. ou alors c'est fait exprès pour savoir ce que tu dis, mais c'est un peu bête dans l'entretient

  17. #17
    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 : 50
    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
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Le mec que j'ai eu en entretien m'a dit que si on faisait ++it,
    dans la boucle for que j'ai donnée, le risque était donc de louper le premier élément.
    Héhé, il ne te reste qu'à envoyer ton CV au boss du gars qui t'a fait passer l'entretien, en lui expliquant qu'il ferait bien de relever un peu le niveau de son équipe
    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.

  18. #18
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    En même temps, le recruteur l'a peut être fait exprès.
    Je me mets à sa place : je dis une énorme connerie. Le candidat ne réagit pas. Bon, bah... dehors !

    deubelte, j'ai une question pour toi:
    T'as pas l'impression de mettre un peu la charrue avant les boeufs parfois ? J'ai reparcouru quelques posts à toi, et j'y ai trouvé des trucs hyper techniques genre :
    • Comment se passe réellement l'allocation mémoire ? voir ICI
    • Qu'est ce qu'une sémantique ? Pendant un de tes autres entretiens où tu sembles répondre des choses que tu ne comprends pas : voir ICI


    Et là, devine quoi, je tombe sur un post où tu demandes spécifiquement quelle est la différence entre la post et la pré incrémentation : voir ICI

    Y'a comme un problème, tu ne trouves pas ?

  19. #19
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Y'a comme un problème, tu ne trouves pas ?
    Je sais, mais étant donné que j'apprends par moi-même le C++, tout vient un peu en même temps tu comprends. Alors c'est pour cela.

    L'apprentissage par soi même ne peut pas être linéaire. Surtout qqch comme le C++ qui demande des connaissances en langage mais aussi en informatique plus générale


    Héhé, il ne te reste qu'à envoyer ton CV au boss du gars qui t'a fait passer l'entretien, en lui expliquant qu'il ferait bien de relever un peu le niveau de son équipe
    Lol, ce sera difficile, c'était justement le boss de la boîte.
    Etant donné le nombre de personnes qui doivent coder en C++ sans vraiment avoir le niveau, je n'imagine pas ce que l'on doit trouver comme erreurs/bug dans les dev C++ des entreprises.

  20. #20
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    L'apprentissage par soi même ne peut pas être linéaire. Surtout qqch comme le C++ qui demande des connaissances en langage mais aussi en informatique plus générale
    Je suis autodidacte et ca été (dans l'ensemble) très linéaire même si c'est encore loin d'être fini (et là je reconnais que c'est moins linéaire du coup :p ).

    Sinon, il suffit d'avoir les bons livres. Je te conseille en particulier Accelerated C++
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Question toute bête sur les formulaires
    Par pekka77 dans le forum Langage
    Réponses: 5
    Dernier message: 01/12/2005, 23h45
  2. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20
  3. [c#] une question de noob... sur les textbox
    Par warenbe dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/08/2005, 23h13
  4. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  5. [LG]J'ai honte : question de cours sur les paramètres
    Par letibdesneiges dans le forum Langage
    Réponses: 14
    Dernier message: 17/01/2004, 13h57

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