Medgilaox
Messages postés1Date d'inscriptiondimanche 4 juin 2017StatutMembreDernière intervention 4 juin 2017
-
Modifié le 4 juin 2017 à 22:10
Joker -
24 sept. 2020 à 23:52
Dalfab
Messages postés704Date d'inscriptiondimanche 7 février 2016StatutMembreDernière intervention19 mai 202311 5 juin 2017 à 11:57
Bonjour,
Si les 2 collections initiales sont pré-triés et n'ont aucun élément en commun, ce code me semble correct, qu'entends-tu par "erreur"?
Sinon :
la première boucle ne se terminera jamais si un élément est commun aux 2 tables.
il ne faut pas comparer les itérateurs avec '<' ou '>=', cela fonctionne avec un vector<> mais interdit les autres collections sans raison. Remplacer 'it < end()' par 'it != end()' et '>= end()' par '== end()' est nettement mieux
il existe une fonction pour insérer une collection dans une autre
éviter d'utiliser using namespace, à la rigueur utiliser des using sur les éléments utilisés
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
int main() {
vector<int> vect1 = {5 , 7 , 8 , 10 , 11} , vect2 = {-2 , 5,13 , 17 , 23 } , vect3;
vector<int>::const_iterator it = vect1.cbegin() , it2 = vect2.cbegin();
vect3.reserve( vect1.size() + vect2.size() ); // optim: le nombre d'elements attendus
while ( it != vect1.cend() && it2 != vect2.cend() ) {
if ( *it > *it2 ) {
vect3.push_back( *it2 );
it2++;
}
else if ( *it < *it2 ) {
vect3.push_back( *it );
it++;
}
else { // identique, insertion sans duplication
vect3.push_back( *it );
it++;
it2++;
}
}
// ajouter ce qui reste eventuellement de vect1 ou vect2
vect3.insert( vect3.end() , it , vect1.cend() );
vect3.insert( vect3.end() , it2 , vect2.cend() );
for ( auto const& elem : vect3 )
cout << elem << " ";
}
Quand le premier pointeur arrive a la fin de son Vecteur , il va etre incrémenté puis pointer sur une case mémoire non allouée au vecteur .
(dans notre cas ici , on va pointer la case 6 du premier vecteur (Case qui n'existe pas) car it a subi une incrémentation alors qu'il pointair sur la derniere case )