2016-05-14 9 views
0

私はこのコード(または他のコーディングプロジェクト)をしばらく作業していないので、コードに基本的に何が間違っているか分かっていますが、ベクトルがどこから外れているかを正確に知るのは苦労していました。私は午前中にそれをgdbで実行しています。私はC++でベクトル "theData"からmin-heapを作成しようとしています。std :: 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

は、それは '私はコードをデバッグしようとしていたし、それに戻ってきたときにN 'の代わりに'左の<= N'と同様に 'right' – sshashank124

+0

のために、私はそのように早くそれを書いた<ままにしないでくださいいくつかの研究をした後。しかし、このバグに違いはありません。 – Anonymous

+0

[MVCE](http://stackoverflow.com/help/mcve)に十分なコードを表示してください。質問のコードをコンパイルすることはできません。例えば、変数 'swaps_'と' data_'は決して宣言されません。また、たとえデータが破損したとしても、機能を破壊するテストデータを提供した場合に役立ちます。 –

答えて

1

minIndexのチェックを入れていません。あなたの< = nと、右< = nの両方去ったとき 見て何が起こるか失敗し、全体の再帰はあなただけでチェックするので、停止しようとしている可能性が高いとき

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 
} 

クイックN簡単な解決策はflagcheckを追加することです

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

ありがとう、それはトリックでした。私はそれほど心配していなかったコードのベクトルアクセスラインをチェックしました。 – Anonymous

+0

すべての再帰には、その中断事があります(基本ケース)。それが壊れたとき、それはout_of_rangeちょっと私に当たった。しかし、助けになるのはうれしい – Phoenix

関連する問題