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 :

Concaténer deux vectors de vector<vector<string>>


Sujet :

Langage C++

Vue hybride

maud4274 Concaténer deux vectors de... 07/08/2014, 11h20
Invité Salut. En fait c'est... 07/08/2014, 11h41
maud4274 Merci de ta réponse. Je n'ai... 07/08/2014, 12h48
Invité Re, les éléments de ton... 07/08/2014, 13h32
maud4274 Merci! Je ne suis pas très... 07/08/2014, 13h49
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut Concaténer deux vectors de vector<vector<string>>
    Bonjour,
    Voilà plusieurs semaines que je bloque sur le même problème. J'ai beau le tourner dans tous les sens, je ne trouve pas de solution ou d'algorithme adapté. Je vous expose mon problème en espérant être le plus claire possible :
    Je dispose le vector de vector suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<string>> myVector;
    Ce vector, je le rempli à partir d'un fichier texte, voici un exemple de son remplissage :
    Vector 1 : 1 1 14 9 8
    Vector 2 : 1 2 6 3 9
    Vector 3 : 1 3 6 9 8
    Vector 4 : 1 1 6 3 2
    Vector 5 : 1 2 3 6 9

    Mon vector de vector est de la forme suivante donc : Vector 1 Vector 2 Vector 3 Vector 4 en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myVector.push_back(Vector 1);
    idem pour les autres

    Je souhaite comparer les deux premiers elements de chaque vectors. Par exemple, Vector 1 et Vector 4 ont les deux même premiers éléments, je souhaite donc remplir un nouveau vector de vector (ou une autre structure peu importe) avec :
    Vector 1 : 1 1 14 9 8 6 3 2 (j'ai concaténer Vector 1 et Vector 4 en supprimant les deux premiers éléments de Vector 4)
    Vector 2 : 1 2 6 3 9 3 6 9 (j'ai concatener Vector 2 et 5 d ela même manière)
    Vector 3 : 1 3 6 9 8

    Mon problème est a plus grande echelle bien sur avec des milliers de données.

    Pour l'instant, je dispose donc de mon vector de vector mais je ne vois pas comment le parcourir pour ne comparer que les deux premiers éléments. J'ai voulu partir comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int k=0; k <myVector.size(); k++)
    {	
    	for (int s=0 ; s<myVector[k].size(); s++)
    	{
                          for (int u=0; u <myVector.size(); u++)
    	        {
    		for (int a=0 ; a<myVector[u].size(); a++)
    		{
                                         // Comparaison de myVector[k][s] et myVector[u][a] ?????
                               }
                         }
                  } 
    }
    Je sais que je ne suis pas sur la bonne voie et que je complique le problème. Si quelqu'un peut m'expliquer mes erreurs et me donner une voie pour mon problème, ça serait super !
    J'ai fais beaucoup de recherche sur le net pour trouver des fonctions adaptées mais aucune ne convient...

    Je vous remercie d'avance pour vos réponses !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut.

    En fait c'est simple, tu compliques en effet le problème.

    Il suffit d'utiliser deux itérateurs si tu veux parcourir uniquement un nombre limité d'éléments :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<std::vector<std::string>>::iterator it1;
    std::vector<std::string>::iterator it2;
    for (it1 = vecteur1.begin(); it1 != vecteur1.begin()+2; it1++) {
         for(it2 = vecteur.begin(); it2 != vecteur2.begin()+2; it2++) {
     
         }
    }

    Ceci va parcourir les 2 1er éléments du vecteur 1 et du vecteur 2.

    C'est ça que tu cherchais ?

    Et pour concaténer, tu peux utiliser la fonction insert :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::vector<std::string>::iterator it3;
    vecteur1.insert(it3->begin(), it1->begin(), it1->begin() + 2);
    vecteur2.insert(it3->begin(), it2->begin(), it2->begin() + 2);
    Ceci va concaténer les 2 1er élément du vecteur1 et du vecteur 2 en les ajoutant dans le vecteur 3. (A partir du début de vecteur 3)

    Ca m'étonne que tu n'aies pas trouvé sur internet.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Merci de ta réponse.
    Je n'ai pas très bien compris ton explication.
    Lorsque tu déclare les itérateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<vector<std::string>>::iterator it1;
    vector<string>::iterator it2;
    Si je fais une boucle avec it1 de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (it1 = vecteur1.begin(); it1 != vecteur1.begin()+2; it1++) 
    {
    }
    Il me semble que (*it1) renvoi un vector et non un élément de mon vector. Or si je laisse le begin()+2 cela va me parcourir que les deux premiers vector de myVector non ? Or je veux tous les parcourir.
    Et comme je l'ai dit, j'ai des miliers de vector a comparer donc je cherche une méthode générique.

    Je te remercie encore de ta réponse. En fait, je cherche à comparer mes vector deux à deux de mon vector de vector myVector.

    Merci d'avance

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re, les éléments de ton premier vector sont des vectors donc oui forcément que le 1er itérateur va parcourir des vectors, tu ne peux pas faire autrement.

    Si tu veux parcourir tout les éléments de ton 1er vector tu remplace vecteur1.begin() + 2 par vecteur1.end().

    Je ne comprends pas très bien ou est ton problème.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Merci!
    Je ne suis pas très claire je suis désolée.
    En fait, si j'ai l'itérateur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<string>>::iterator it1
    Et que je fais la boucle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (it1 = vecteur1.begin(); it1 != vecteur1.end(); it1++) 
    {
    }
    Est ce que tu es d'accord avec moi pour dire que (*it1) est un vector<string> ? Où est ce que je me plante la aussi ?
    Ensuite si je fais la boule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(it2 = (*it1).begin(); it2 != (*it1).begin()+2; it2++) 
    {
    }
    Donc (*it2) devrait me renvoyer à chaque itérations, un élément (jusqu'au 2ème) c'est bon ?
    Ensuite mon soucis, c'est que tu me propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (it1 = vecteur1.begin(); it1 != vecteur1.begin()+2; it1++) {
         for(it2 = vecteur2.begin(); it2 != vecteur2.begin()+2; it2++) {
     
         }
    }
    Mais que représente vecteur1 et vecteur2 dans ton code par rapport à mon cas ?
    est ce que vecteur1 est bien myVector ? Sinon peux-tu m'expliquer ce qu'il représente ?
    Sachant que myVector est composé de 1000 vecteurs, je ne me vois pas faire mille boucle.
    Je crois que je confond tes vecteur1 et 2, et les vecteur 1 et 2 de mon premier post.

    Je te remercie de ta patience.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re,
    oui tu dois confondre les vectors dans tes boucles à mon avis, it1 représente un ensemble de vector<string>. (Pas qu'un seul!)

    it1 contient juste une adresse mémoire pour chaque élément de vecteur1 et it2 l'adresse mémoire de chaque élément de ton deuxième vecteur.

    Tu peux donc facilement récupérer l'élément n°i du vecteur 1 et du vecteur deux en faisant vecteur1.begin() qui renvoie l'adresse mémoire du 1er élément de ton vecteur +i.
    vecteur1.end() correspond au dernière élément de ton 1er vecteur.

    Car les éléments d'un vecteur sont contigü. (c'est à dire qu'ils sont stocké l'un après l'autre en mémoire)

    Donc for (it1 = vecteur1.begin(); it1 != vecteur.end(); i++) va parcourir tout les éléments de ton 1er vecteur.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(it2 = (*it1).begin(); it2 != (*it1).begin()+2; it2++) 
    {
    }

    Ce code, ne va pas compiler car it1 et it2 ne pointent pas sur un vecteur de même type.

    it1 pointe sur vector<vector<std::string>> et it2 sur vector<string>

    Mais que représente vecteur1 et vecteur2 dans ton code par rapport à mon cas ?
    est ce que vecteur1 est bien myVector ?
    vecteur1 représente à myVector en effet.

    Sachant que myVector est composé de 1000 vecteurs, je ne me vois pas faire mille boucle.
    Tu n'as pas besoin de faire 1000 boucles, une seule boucle suffit pour parcourir tes 1000 vecteur.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (it1 = vecteur1.begin(); it1 != vecteur.end(); i++)

    Ceci va parcourir tes 1000 vecteur de type std::vector<string> de myVector.

    C'est comme un tableau à deux dimension en fait, ça marche exactement de la même manière.

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

Discussions similaires

  1. Concaténer deux vectors et éliminer les doublons
    Par masoum dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 24/10/2012, 16h40
  2. [Vector] Utilisation d'un Vector
    Par LP-mpascolo dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 04/06/2007, 16h50
  3. Réponses: 3
    Dernier message: 04/12/2006, 13h01
  4. [Debutant][Vector]Petit problème de vector
    Par GyZmoO dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/05/2006, 10h39
  5. [Vector] Ajouter un Vector dans un autre Vector
    Par VinceFromBcn dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/06/2004, 21h54

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