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 :

std::vector et références


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut std::vector et références
    Bonjour,

    J'essaye d'optimiser un programme C++ embarqué (Arduino).

    Dans ce programme, je crée des objets que je range dans un vector. Je voudrais pouvoir les récupérer dans un autre ordre. Pour éviter de créer des copies, j'essaye d'utiliser les références, mais ça ne passe pas à la compile : j'ai l'impression qu'il est impossible de déclarer un vector de références... Me goure-je ?

    Merci de vos lumières.

    PS : je voudrais éviter les pointeurs autant que possible...

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Un tableau de références est impossible
    Pour éviter les copies, de simples objets suffisent
    Ce n'est pas les objets qui passent en références, mais le tableau lui-même
    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.

  3. #3
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Pas sûr de comprendre... Peux-tu me dire comment tu fais sur un petit exemple ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Si tu es en C++11, remplis ton vecteur avec la méthode emplace_back(), et quand tu veux exploiter les valeurs, extrait les vers des références constantes.

  5. #5
    Membre confirmé Avatar de fma38
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 119
    Par défaut
    Non, pas de chance, pas de C++1

    La question est : si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vect2.push_back(vect1[i])
    est-ce que je crée une copie de l'objet vect1[i] que j'ajoute ensuite à vect2, ou est-ce que c'est le même objet qui est inséré ?

  6. #6
    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
    push_back crée une copie (ou un déplacement en C++11 si l'objet est temporaire).
    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.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par fma38 Voir le message
    Non, pas de chance, pas de C++1

    La question est : si je fais :

    vect2.push_back(vect1[i])

    est-ce que je crée une copie de l'objet vect1[i] que j'ajoute ensuite à vect2, ou est-ce que c'est le même objet qui est inséré ?
    Non, ce sera d'office une copie.

    l'opérateur [] renvoie une référence (éventuellement constante) sur l'objet qui est situé à l'indice indiqué entre les crochets, et une référence ne peut -- comme tu l'as si bien fait remarquer -- pas prendre place dans une collection.

    La raison est simple : une référence n'est qu'un alias de l'objet référencé. Elle n'a donc pas d'existence réelle bien à elle (elle n'existe qu'au travers de l'objet référencé).

    il y a donc, forcément, copie lorsque tu utilises le résultat de l'opérateur [] pour remplir un autre tableau.
    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

  8. #8
    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
    Citation Envoyé par fma38 Voir le message
    Non, pas de chance, pas de C++1
    C'est faux.

    Tu compiles pour arduino avec avr-g++, qui juste un compilateur g++ classique mais qui produit du code pour ... ARM

    Il y a cependant quelques restrictions : IIRC pas de RTTI ni d'exceptions

    Il suffit d'activer le flag pour utiliser C++11 (sans la STL) sans soucis.
    Pour la STL, ya des portages, mais plus des portages de la STL de C++03.

    Apres, ya des soucis lies au fait qu'on soit sur un microcontroleur.
    On est vite limité en RAM, avr-g++ place les vtable en Flash ET en RAM,...

    Pour info, jai passé un an a code sur une Arduino mega avec Emacs, Makefile & C++11 et j'ai pu utiliser des varuadic templates , du tag-dispatch et des std::vector

    Sinon tu peux détailler ?

    • ta carte: Uno/Mega/Due/...
    • Ton problème exact avec un peu de code
    • Tes contraintes: performance ou occupation de ram ?

    Car un vecteur de unique_ptr que tu tries au besoin, ca peut s'envisager.
    "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)

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/06/2013, 11h23
  2. Retourner une référence sur un std::vector
    Par Rodrigue dans le forum C++
    Réponses: 12
    Dernier message: 13/10/2007, 16h30
  3. char[50] et std::vector<>
    Par tut dans le forum SL & STL
    Réponses: 9
    Dernier message: 12/10/2004, 13h26
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30

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