Tableaux dynamique tri par fusion [Résolu]

Medgilaox 1 Messages postés dimanche 4 juin 2017Date d'inscription 4 juin 2017 Dernière intervention - 4 juin 2017 à 21:05 - Dernière réponse : Dalfab 351 Messages postés dimanche 7 février 2016Date d'inscription 7 août 2018 Dernière intervention
- 5 juin 2017 à 11:57
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++;
 }
}
Afficher la suite 

Votre réponse

1 réponse

Dalfab 351 Messages postés dimanche 7 février 2016Date d'inscription 7 août 2018 Dernière intervention - 5 juin 2017 à 11:57
0
Merci
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 << " ";
    }
Commenter la réponse de Dalfab

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.