Tableaux dynamique tri par fusion [Résolu]

Signaler
Messages postés
1
Date d'inscription
dimanche 4 juin 2017
Statut
Membre
Dernière intervention
4 juin 2017
-
 Joker -
cest quoi lerreur dans ce programme svp:
#include <iostream>
#include <vector>
using namespace std;

int main()
{
 vector<int> vect1 = {5,7,8,10,11},vect2 ={-2,13,17,23},vect3;
 vector<int>::iterator it= vect1.begin(),it2=vect2.begin();
 
 while(it<vect1.end()&&it2<vect2.end())
 {
  if(*it>*it2)
  {
   vect3.push_back(*it2);
   it2++;
  }
  else if(*it<*it2)
  {
   vect3.push_back(*it);
   it++;
  }
 }
 if(it>=vect1.end())
 {
  while(it2<vect2.end())
  {
   vect3.push_back(*it2);
   it2++;
  }
 }
 else if(it2>=vect2.end())
 {
  while(it<vect1.end())
  {
   vect3.push_back(*it);
   it++;
  }
 }
 it = vect3.begin();
 while(it<vect3.end())
 {
  cout<<*it<<" ";
  it++;
 }
}

2 réponses

Messages postés
545
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
15 avril 2021
5
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 )