2016-05-23 3 views
1

Ich versuche, eine Implementierung von Bubble-Sort, die eine Template-Funktion ist zu schreiben.C++ Länge Fehler mit Bubble-Sortierung auf einem Vektor

Wenn ich diesen Algorithmus mit einem regelmäßigen ol 'Array austeste, scheint es gut zu funktionieren. Ich bekomme die richtige Ausgabe.

Wenn ich es jedoch mit einem Vektor teste, erhalte ich eine length_error Ausnahme, und ich bin nicht wirklich sicher warum.

template<class T> 
void swap_right(T a[], int index) 
{ 
    T temp = a[index]; 
    a[index] = a[index+1]; 
    a[index+1] = temp; 
} 

template<class T> 
void bubbleSort(T a[], int size) 
{ 
    for(int i = 0; i < size; ++i) 
    { 
     for(int j = 0; j < (size-i); ++j) 
     { 
      if(a[j] > a[j+1]) 
      { 
       swap_right(a, j); 
      } 
     } 
    } 
} 

#include <iostream> 
#include <vector> 

int main(int argc, const char * argv[]) 
{ 
    std::vector<int> v {9, 5, 3, 7, 4, 1}; 
    bubbleSort(&v, 6); 
    for(int i = 0; i < 6; ++i) 
    { 
     std::cout << v[i] << std::endl; 
    } 
    return 0; 
} 
+0

'BubbleSort (v.data(), 6); 'Sie übergeben einen Zeiger an den Vektor selbst, nicht an seinen Inhalt. – user657267

+0

Ich würde vorschlagen, dass Ihre Funktionen akzeptieren eine 'std :: vector &' anstelle von 'T []'. Ich würde auch vorschlagen, 'std :: swap' anstelle einer benutzerdefinierten Version zu verwenden. –

+0

Werfen Sie einen langen Blick auf dieses 'j + 1'. Wird es immer funktionieren? Überprüfen Sie auf Größe == 1. –

Antwort

2

übergeben Sie einen Zeiger auf den Vektor, die im Grunde bedeutet, dass Sie versuchen, eine Reihe von Vektoren zu sortieren, was nicht korrekt ist, und werden-undefiniertes Verhalten führen.

Stattdessen sollten Sie die Inhalte des Vektors an die Sortierfunktion übergeben, z. die data() Memberfunktion:

bubbleSort(v.data(), v.size()); 
0

würde ich vorschlagen, dass Sie Ihre Funktionen akzeptieren einen std :: vector & statt T [].

Ich würde auch vorschlagen, std :: swap anstelle einer benutzerdefinierten Version. - Alex Zywicki 3 Minuten vor bearbeiten

#include <iostream> 
#include <vector> 


template<class T> 
void bubbleSort(std::vector<T>& a) 
{ 
    for(unsigned i = 0; i < a.size(); ++i) 
    { 
     for(unsigned j = 0; j < (a.size()-i)-1; ++j) 
     { 
      if(a[j] > a[j+1]) 
      { 
       std::swap(a[j],a[j+1]); 
      } 
     } 
    } 
} 


int main(int argc, const char * argv[]) 
{ 
    std::vector<int> v {9, 5, 3, 7, 4, 1}; 
    bubbleSort(v); 
    for(unsigned i = 0; i < v.size(); ++i) 
    { 
     std::cout << v[i] << std::endl; 
    } 
    return 0; 
} 

Live-Demonstration: http://coliru.stacked-crooked.com/a/e22fe55a38425870

Ergebnis ist:

+0

Wenn 'i' null ist, kann' j' auf 'a.size() - 1' gehen. Sie beziehen sich dann auf 'a [j + 1]', die am Ende ist. (Dieser Fehler ist auch im OP vorhanden) –

+0

Ich habe meine Antwort bearbeitet, um den Fehler zu beheben –

Verwandte Themen