Recherche d'éléments communs dans deux vector

Recherche d'éléments communs dans deux vector - C++ - Programmation

Marsh Posté le 30-10-2002 à 16:52:13    

Salut à tous,
voila, j'ai deux vector<int> et j'ai besion d'en construire un troisième qui contient l'intersection de ces deux vector....
voici donc mon code:
 

Code :
  1. vector<int> intersection;
  2. intersection.push_back(0);
  3. insert_iterator< vector<int> > it(intersection,intersection.begin());
  4. set_intersection(numeros1.begin(),numeros1.end(),numeros2.begin(),numeros2.end(),it);
  5. copy(intersection.begin(),intersection.end(),it);
  6. for(int i=0;i<intersection.size();i++)
  7.     if(intersection[i] != 0)
  8.         grp->add(intersection[i]);


 
je crée donc mon vector résultat et je met qch dedans (sinon ca plante) ensiote je doit ajouter les valeurs une par une avec une méthode (add(int)) dans grp (un objet d'une classe perso.) Le problème est que dans "intersection" (le vector resultat) j'ai plusieur fois les memes numéros:
par ex:
numeros1 -> 123456
numeros2 -> 456789
intersection -> 44456   :ouch:  
est-ce que quelqu'un voit une erreur dans mon code ou a connu le même problème...
Merci

Reply

Marsh Posté le 30-10-2002 à 16:52:13   

Reply

Marsh Posté le 30-10-2002 à 17:03:36    

il faut que les sequences soit triées avant tout => std::sort
 
 
et aulieu de faire ca
 

Code :
  1. intersection.push_back(0);
  2. insert_iterator< vector<int> > it(intersection,intersection.begin());


 
utilises plutot un back_inserter, c'est plus élégant
 
http://www.sgi.com/tech/stl/back_insert_iterator.html
 

Code :
  1. template<class BackInsertionSequence> back_insert_iterator<BackInsertionSequence>
  2. back_inserter(BackInsertionSequence& S)


 


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 30-10-2002 à 17:17:41    

Merci Taz@PPC  :hello: , ca marche...
je suis pas encore très au point sur out ce qui touche aux itérateurs...

Reply

Marsh Posté le 30-10-2002 à 17:20:15    

polyacetal a écrit a écrit :

Merci Taz@PPC  :hello: , ca marche...
je suis pas encore très au point sur out ce qui touche aux itérateurs...




 
raison de plus pour chercher les solutions simples  :hello:
 
ca marche back_inserter?
 
y a aussi front_inserter mais ce n'est pas adapté pour un vector.
 
tu peux aussi simplement utilisé les std::set


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 30-10-2002 à 17:24:31    

Bah oui ca marche, en gros j'ai juste rajouté back_ devant insert_iterator et plus de problème...

Reply

Marsh Posté le 30-10-2002 à 17:27:22    

:non: meme pas besoin
 
back_inserter est une fonction qui renvoie un back_inserter_iterator
 
 

Code :
  1. fonction(...., back_inserter(conteneur));


 


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 30-10-2002 à 22:53:15    

Qu'est-ce que c'est l'intersection de deux vecteurs?

Reply

Marsh Posté le 30-10-2002 à 23:05:43    

les éléments en communs


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 31-10-2002 à 05:06:30    

theorie des ensembles:
definition des operations binaires,  
union, intersection
 
union = tous les elements presents dans un ou l'autre ensemble
intersection = tous les elements presents dans l'un et dans l'autre ensemble.
 
Apres tu as la difference, qui est l'ensemble des elements presents dans l'un mais pas dans l'autre etc.. (c'est l'union prive de l'intersection).
 
En primaire on faisait faire ca aux gosses, on devait dessiner des patates avec des croix a l'interieur. je ne sais pas si ca se fait encore..
 
LeGreg
 

Reply

Marsh Posté le 31-10-2002 à 09:05:00    

Ouais ca je sais, mais quand on parle d'ensembles; J'ai jamais intersecté des vecteurs; A moins que vous ne vouliez parler des composantes qui ont les memes valeurs?
 
A = {1, 2, 3, 4}
B = {3, 4, 0, 4}
 
A inter B donne quoi? {0, 0, 0, 4} ou {3, 4} ?

Reply

Marsh Posté le 31-10-2002 à 09:05:00   

Reply

Marsh Posté le 31-10-2002 à 10:35:15    

Si tu as la possibiliter de trier tes deux vector (avec std::sort), tu dois pouvoir utiliser "set_intersection".
 
Sinon tu peux utiliser un "set" en sortie (ensemble d'elements distincts).

Reply

Marsh Posté le 31-10-2002 à 10:35:45    

{3, 4}


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 31-10-2002 à 10:43:33    

Un exemple
 

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <iterator>
  5. int main(int argc, char *argv[])
  6. {
  7.     int array1[] = {1, 2, 3, 4};
  8.     int array2[] = {3, 4, 0, 4, 1};
  9.     size_t LEN1 = sizeof(array1)/sizeof(array1[0]);
  10.     size_t LEN2 = sizeof(array2)/sizeof(array2[0]);
  11.     std::sort(array1, array1+LEN1);
  12.     std::sort(array2, array2+LEN2);
  13.    
  14.     typedef std::vector<int> TotoT;
  15.     TotoT toto;
  16.     std::set_intersection(array1, array1+LEN1, array2, array2+LEN2,
  17.         std::back_inserter<TotoT>(toto));
  18.    
  19.     std::copy(toto.begin(), toto.end(), std::ostream_iterator<int>(std::cout, " " ));
  20.     std::cout << std::endl;
  21.    
  22.     return 0;
  23. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed