2016-05-14 2 views
0

Я пренебрег работой над этим кодом (или любыми другими проектами кодирования) некоторое время, поэтому, хотя я знаю, что в основном неправильно с кодом, с трудом находили, где именно вектор выходит за пределы диапазона. Я все время бегаю gdb на все утро безрезультатно. Я пытаюсь сделать мини-кучу из вектора «theData» в C++.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

если не это будет 'влево sshashank124

+0

я написал, что путь раньше, когда я пытался отладить код и вернулись к нему после делать некоторые исследования. Однако не имеет значения в этой ошибке. – Anonymous

+0

Попробуйте показать достаточно кода для [MVCE] (http://stackoverflow.com/help/mcve). Код из вопроса не может быть скомпилирован. Например, переменные 'swaps_' и' data_' никогда не объявляются. Это также помогло бы, если бы вы предоставили тестовые данные, которые нарушают функцию, даже если ломаются для любых данных. –

ответ

1

Вы не ставите проверку на minIndex. Посмотрите, что происходит, когда слева < = п и правая < = п и не удается, скорее всего, когда вся рекурсии собирается останавливаться, так как вы просто проверить

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

Смежные вопросы