2016-05-14 8 views
0

Ich habe eine Zeitlang an diesem Code (oder anderen Codeprojekten) gearbeitet, obwohl ich weiß, was im Grunde mit dem Code nicht stimmt, Ich habe es schwer gefunden, genau herauszufinden, wo der Vektor außerhalb der Reichweite ist. Ich habe den ganzen Morgen gdb darauf gespielt, ohne Erfolg. Ich versuche einen Min-Heap aus einem Vektor "theData" in C++ zu machen.Std :: Vektor außerhalb des Bereichs für Min-Heap: C++

#include <iostream> 
#include <vector> 
#include <algorithm> 

using std::vector; 
using std::cin; 
using std::cout; 
using std::swap; 
using std::pair; 
using std::make_pair; 

class HeapBuilder { 
    private: 
     vector<int> data_; 
     vector< pair<int, int> > swaps_; 

void WriteResponse() const { 
     cout << swaps_.size() << "\n"; 
for (int i = 0; i < swaps_.size(); ++i) { 
    cout << swaps_[i].first << " " << swaps_[i].second << "\n"; 
     } 
} 

void ReadData() { 
     int n; 
     cin >> n; 
     data_.resize(n); 
     for(int i = 0; i < n; ++i) 
     cin >> data_[i]; 
} 

    void makeMinHeap(vector<int> &theData, int i, int n) { 
    int minIndex; 
    int left = 2*i; 
    int right = 2*i + 1; 
     if (left < n && theData.at(left) < theData.at(i)) { 
     minIndex = left; 
    } 
    else if (right < n && theData.at(right) < theData.at(i)) { 
     minIndex = right; 
    } 

if (minIndex != i) { 
    swap(theData.at(i), theData.at(minIndex)); 
    swaps_.push_back(make_pair(i, minIndex)); 
    makeMinHeap(theData, minIndex, n); 
    } 
} 

    void GenerateSwaps() { 
    swaps_.clear(); 
    int size = data_.size(); 
    for (int i = (size/2); i >= 0; i--) { 
    makeMinHeap(data_, i, size); 
    } 

    } 

public: 
    void Solve() { 
    ReadData(); 
    GenerateSwaps(); 
    WriteResponse(); 
    } 
}; 

int main() { 
    std::ios_base::sync_with_stdio(false); 
    HeapBuilder heap_builder; 
    heap_builder.Solve(); 
    return 0; 
} 
+0

Sollte es nicht 'gelassen werden sshashank124

+0

right' ich es geschrieben habe auf diese Weise früher, als ich versuchte, den Code zu debuggen und haben es wieder nach einigen Recherchen. Es macht jedoch keinen Unterschied in diesem Fehler. – Anonymous

+0

Bitte versuchen Sie, genügend Code für eine [MVCE] (http://stackoverflow.com/help/mcve) zu zeigen. Der Code aus der Frage kann nicht kompiliert werden. Zum Beispiel werden die Variablen 'swaps_' und' data_' niemals deklariert. Es würde auch helfen, wenn Sie Testdaten zur Verfügung stellen, die die Funktion unterbrechen, selbst wenn sie für irgendwelche Daten bricht. –

Antwort

1

Sie überprüfen keinen minIndex. Schauen Sie, was passiert, wenn die linke Seite < = n und rechts < = n beide nicht, höchstwahrscheinlich, wenn die ganze Rekursion ist etwa zu stoppen, da Sie nur

überprüfen
minIndex != i 
// ^-- default each time is garbage which in case last>n && right>n leaves it garbage 
// hence when it comes to 
if(minIndex!=i){ 
// It's actually true where it was suppose to break out n thus throws out_of_range 
} 

Schnell n einfache Lösung wäre, eine flagcheck hinzufügen

bool flagcheck = false; 
if(){ flagcheck = true; } 
else if(){ flagcheck = true; } 
if(minIndex!=i && flagcheck){} 
+0

Danke, das hat den Trick gemacht. Ich war so konzentriert mit der Überprüfung der Vektorzugriffszeilen des Codes, dass ich nicht daran dachte. – Anonymous

+0

Bei jeder Rekursion gibt es dieses Breakding (Base Case). Wann wird es brechen, das ist kombiniert mit out_of_range irgendwie getroffen mich. Freut mich jedoch, Ihnen behilflich zu sein – Phoenix

Verwandte Themen