2016-05-14 44 views
0

我忽略了在这段代码(或任何其他编码项目)上工作了一段时间,所以虽然我知道代码基本错误,我一直很难找到矢量超出范围的确切位置。我一直在上面运行gdb而无济于事。我试图用C++中的矢量“theData”创建一个最小堆。std ::向量超出最小堆的范围: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

它不应该被留下' sshashank124

+0

我写了这样的说法年初的时候,我试图调试代码,并返回给它经过一番研究。不过,这个bug并没有什么不同。 – 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 
} 

快速ñ简单的解决方法是添加一个flagcheck

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

谢谢,那就是诀窍。我非常专注于检查我没有想到的代码矢量访问行。 – Anonymous

+0

随着每一次递归都有这样的事情(基本情况)。当它突破时,这与out_of_range相结合有点打了我。很高兴成为帮助 – Phoenix