调试时,矢量下标超出范围

时间:2017-10-26 04:55:12

标签: c++ vector

代码是构建最小堆的一部分。看来下面的句子出错了。

if ((child < (int)heap.size() - 1) && (heap[leftchild].cost > heap[leftchild + 1].cost))

但我无法弄清楚如何管理它。有没有人提供一些帮助?非常感谢!!

void heap_adjust_down(vector<rt_node> & rt, vector<h_node> & heap)
{
    cout << "the" << heap.size() << "times" << endl;
    cout << heap[heap.size()-1].id << endl;
    int child;
    for (int i = heap.size() / 2; i >= 0; i--)
    {
        cout << " into build heap, i = " << i << endl;
        int leftchild = 2 * i + 1;
        h_node temp_h;

        for (temp_h = heap[i]; leftchild < (int)heap.size(); i = child)
        {
            leftchild = 2 * i + 1;
            cout << "  into percdown" << endl;
            child = leftchild;
            if ((child < (int)heap.size() - 1) && (heap[leftchild].cost > heap[leftchild + 1].cost))
            {
                child++;
            }
            if (heap[child].cost < temp_h.cost )
            {
                heap[i] = heap[child];
                rt[i].h_pos = child;
            }
            else break;
            cout << "i = " << i << endl;
        }
        heap[i] = temp_h;
        rt[i].h_pos = i;
    }
}

1 个答案:

答案 0 :(得分:0)

问题更可能是这一行:

if (heap[child].cost < temp_h.cost )

此行没有像您在上一个if语句中所做的那样检查child < size。此外,在内部for循环的第二次迭代中,leftchild将至少加倍(孩子也是如此)。这似乎不是你的意图。 (leftchild将加倍,因为您在循环迭代器中设置i = child。)

内部for循环需要重新考虑。例如,您的测试表达式会测试leftchild < size,但您会立即根据leftchild重新计算i,从而使该测试无效。