2016-11-18 1 views
0

J'ai un problème de codage à propos d'un exercice "simple" sur le tri de ce qui est à l'intérieur d'un vecteur de n nombres entiers. Le problème est que le compilateur n'accepte pas void en tant que type pour le tri par fonction (et cela doit être une fonction vide). Mais je ne comprends vraiment pas pourquoi. Pour les variables, le type correspond (pointeur < -> v.begin() par exemple) mais pas pour la fonction. Toute aide appréciée! Voici mon code:Erreur sur une fonction vide avec un argument vectoriel

#include <iostream> 
#include <vector> 

typedef std::vector<int>::iterator Vit; 


void sort(Vit begin, Vit end){ 
    int len = end - begin; 
    for(begin; begin < end; ++begin){ 
     for(int i = 1; i < len; ++i){ 
      if(*begin < *(begin +i)){ 
       *begin = *(begin + i); 
      } 
     } 
    } 
    std::cout<< "* "; 
    for(begin; begin < end; ++begin){ 
     std::cout<< *begin<< " "; 
    } 
    std::cout<< "*"; 
    return; 
} 



int main(){ 
    int n; 
    std::cin >> n; 
    std::vector<int> v(n); 
    for(Vit it = v.begin();it != v.end(); ++it){ 
     std::cin >> *it; 
    } 

    void sort (v.begin() , v.end()); 

} 
+4

En principal, changer 'void sort (de v.begin(), v.end());' 'à tri (v.begin(), v.end()); –

+0

Correct! Merci beaucoup c'est une erreur vraiment stupide ... Pourriez-vous également m'expliquer pourquoi le code ne fonctionne pas? Il devrait trier les éléments à l'intérieur d'un vecteur. –

+0

Il semble que vous deviez apprendre à utiliser un débogueur pour parcourir votre code. Avec un bon débogueur, vous pouvez exécuter votre programme ligne par ligne et voir où il dévie de ce que vous attendez. C'est un outil essentiel si vous voulez faire de la programmation. Pour en savoir plus: ** [Comment déboguer de petits programmes] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

Répondre

0

Il y a quelques erreurs. Vous commencez à incrémenter dans la première boucle, mais vous ne le réinitialisez jamais. Donc, la seconde boucle ne sera jamais entrée. Chaque ++ change modifie la position de votre itérateur! La boucle pour (int i = 1; i < len; ++ i) ira à la position actuelle de begin plus i et quittera donc la mémoire. qui suit devrait faire ce que vous voulez:

#include <iostream> 
#include <vector> 

typedef std::vector<int>::iterator Vit; 

void sort(Vit begin, Vit end){ 
    for(Vit pos1=begin; pos1 < end; ++pos1) { 
    for(Vit pos2=pos1+1; pos2 < end; ++pos2) { 
     if(*pos1 < *pos2) { 
    int swap = *pos1; 
    *pos1 = *pos2; 
    *pos2 = swap; 
     } 
    } 
    } 
    std::cout<< "* "; 
    for(Vit it=begin; it < end; ++it){ 
    std::cout<< *it<< " "; 
    } 
    std::cout<< "*"; 
    return; 
} 

int main(){ 
    int n; 
    std::cin >> n; 
    std::vector<int> v(n); 
    for(Vit it = v.begin(); it < v.end(); ++it){ 
    std::cin >> *it; 
    } 

    sort (v.begin() , v.end()); 
} 
+0

Merci beaucoup! Cette partie du code sur l'échange était vraiment utile. Il n'a pas rempli les demandes de l'execrcise mais j'ai réussi à comprendre ce qui manquait et j'ai corrigé le code, merci beaucoup! –