Ошибка сегментации в пользовательской куче - PullRequest
0 голосов
/ 07 июня 2019

Он даже не выполняет операцию нажатия. Это не вызов функции push, просто вызов конструктора и ошибка сегментации. Почему это происходит?

class Heap {
    vector<int> v;

     void Heapify(int x) {
        int mi = x;
        int l = 2 * x;
        int r = 2 * x + 1;

        if (v[mi] > v[l] && l < v.size()) {
            mi = l;


        }
        if (v[mi] > v[r] && r < v.size()) {
            mi = r;
        }

        if (mi != x) {
            swap(v[mi], v[x]);
            Heapify(mi);
        }
                       }
public:
    Heap() {

        v[0] = -1;
    }
    void push(int x) {

        v.push_back(x);
        int i = v.size()-1;
        int p = i / 2;
        while (i > 1 && v[i] < v[p]) {


            swap(v[p], v[i]);
            i = p;
            p = p / 2;

        }

    }
    void pop() {
        swap(v[v.size() - 1], v[1]);
        v.pop_back();
         Heapify(1);
    }


};
int main(){

    Heap h;
    h.push(5);

}

1 Ответ

4 голосов
/ 07 июня 2019
Heap() {
        v[0] = -1; // Segfault.
}

В этот момент вектор v пуст, и вы пытаетесь назначить первый элемент (v[0]). Это выходит за пределы вектора, поэтому поведение программы не определено (здесь происходит сбой).

Вам следует использовать v.push_back(-1), если вы действительно хотите вставить -1 в начале вектора.

...