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 :

vector et copie


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut vector et copie
    Bonjour,

    Ma question est toute simple mais je ne trouve pas la réponse...

    J'ai un vector contenant disons 100 doubles.

    J'aimerais pouvoir crée un vector contenant les valeurs des positions 20 a 40 de mon gros vector.

    En gros un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monPetitVect<double> = new vector (monGrosVect[20]; monGrosVect[40]);
    Mon petit vector contiendrait donc 20 doubles qui sont les valeurs contenus dans mon gros vector aux positions de 20 a 40.

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    Je procède de la façon suivante mais il y a sans doute mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<double>::const_iterator first = myVector.begin() + 20;
    std::vector<double>::const_iterator last = myVector.begin() + 40;
    std::vector<double> subcopyMyVector(first, last);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    Salut!

    Merci pour ta réponse mais il me semble qu'il y a plus rapide (vieux souvenirs de mes études...^^)

  4. #4
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par vince3320 Voir le message
    Salut!

    Merci pour ta réponse mais il me semble qu'il y a plus rapide (vieux souvenirs de mes études...^^)
    non, il y a plus court comme code donc plus rapide à écrire comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<double> subcopyMyVector(myVector.begin() + 20, myVector.begin() + 40);
    ou alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<double> subcopyMyVector(&myVector[20],&myVector[40]);
    Mais ça ne sera pas plus rapide à l'exécution.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Si le vecteur n'est pas destiné à être modifié, le mieux est encore de ne pas le copier. En effet, les algos de la STL (et ceux qui programment correctement) utilisent une itérateur sur le premier et le dernier+1 élément. Donc il est possible d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unAlgo(myVector.begin() + 20, myVector.begin() + 40);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<double> subcopyMyVector(myVector.begin() + 20, myVector.begin() + 40);
    unAlgo(subcopyMyVector.begin(), subcopyMyVector.end());
     
    // ou encore plus moche
    unAlgo(subcopyMyVector);

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Si le vecteur n'est pas destiné à être modifié, le mieux est encore de ne pas le copier. En effet, les algos de la STL (et ceux qui programment correctement) utilisent une itérateur sur le premier et le dernier+1 élément. Donc il est possible d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unAlgo(myVector.begin() + 20, myVector.begin() + 40);
    Et même depuis C++11 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unAlgo(myVector.cbegin() + 20, myVector.cbegin() + 40);

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonne remarque...
    Il est vrai que je préfère l'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unAlgo(begin(myVector) + 20, begin(myVector) + 40);
    Mais il n'existe pas de fonction libre cbegin().

    begin() renverra aussi un const_iterator, l'utilisation de cbegin() est une question de lisibilité et une garantie plus forte (l'appelant de la fonction sait qu'il ne veut pas que le vecteur soit modifié et si la fonction essaie de le faire, le compilateur râlera)

    Du coup, je sais pas s'il est préférable d'utiliser begin(v) ou v.cbegin()

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur télécom
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur télécom

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 12
    Points
    12
    Par défaut
    Il me semble que la std n'implémente pas cette fonctionnalité. Tu veux pouvoir référencer une partie continue d'un vecteur et en faire une copie. Cette fonctionnalité est présente dans certaines bibliothèques et souvent dans celle de calcul car c'est un besoin récurrent.

    Tu as plusieurs manière de l'implémenter
    -- soit tu fais une copie de la zone mémoire
    -- soit tu utilise un mécanisme d'implicit sharing avec des pointeurs partagés.
    -- soit tu met en place en architecture d'objet te permettant de représenter des segment référençant ton objet donc non responsable de la zone mémoire.

    Par exemple Qt à implémenter la première solution dans ses api avec les fonctions mid regarde le QVector par exemple c'est exactement ce que tu veux faire.

    La deuxième solution n'est pas bien compliquée à implémenter par contre tu as les défaut de l'implicit sharing en terme de performance. Si jamais tu fais des accès avec [] non const par exemple tu auras à chaque accès une vérification afin de savoir si la zone mémoire n'est pas partagée. Mais si c'est pour faire des lectures const tu n'auras pas de surcout.
    La 3ème solution est plus complexe tu peux soit faire une implémentation "fonctionnelle" en plusieurs classes pour représenter un vecteur ou pousser avec le code template. Eigen met en place un mécanisme de ce genre la je crois, le code étant relativement violent je n'ai pas approfondi!!

    Une implémentation d'un conteneur maison avec les méthodes de constructions à partir de std::vector me semble plus simple à réaliser.
    Tu pourras rajouter les méthode mid ou segment qui feront ce dont tu as besoin.

    ++

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    std::vector a un constructeur qui réalise ça tout simplement sinon..
    http://www.cplusplus.com/reference/v...vector/vector/
    (3) range constructor
    Constructs a container with as many elements as the range [first,last), with each element constructed from its corresponding element in that range, in the same order.
    vector::insert permet aussi d'ajouter à partir d'iterator

    Mais est-il vraiment cohérent de créer un autre vector à partir du premier ou pourrais-tu te contenter de passer les valeurs (iterator) qui correspondent au range à traiter à ton algo ?
    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.

Discussions similaires

  1. vector et copy constructor
    Par r0d dans le forum Langage
    Réponses: 5
    Dernier message: 27/12/2012, 19h49
  2. [Vector] Copie des éléments lors d'un push_back() ?
    Par 5kippy dans le forum SL & STL
    Réponses: 4
    Dernier message: 22/11/2007, 11h11
  3. copie de <vector>
    Par dev0077 dans le forum C++
    Réponses: 1
    Dernier message: 05/10/2007, 22h19
  4. Copie de 2 vectors STL
    Par cjacquel dans le forum SL & STL
    Réponses: 2
    Dernier message: 07/12/2006, 21h20
  5. copie vector
    Par Vips dans le forum SL & STL
    Réponses: 11
    Dernier message: 25/03/2006, 11h52

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