2017-10-26 14 views
-4

コードは最小ヒープを構築するための一部です。次の文が間違っているようです。デバッグ時にベクトルの添え字が範囲外になる

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

しかし、私はそれを管理する方法を理解できません。助けてくれる人はいますか?どうもありがとうございました!!あなたは同様にif文以前に行ったよう

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

は、この行はchild < sizeのチェックを持っていません。

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; 
    } 
} 
+0

これは私の問題解決のためのサイトではありません。 – immibis

+0

'' leftchild == vector.size() - 1'ならどうなりますか? – bnaecker

+2

最後のベクトル要素に+1ネイバーがありません。 –

答えて

0

問題は、このラインより可能性が高いです。また、内側のforループの2回目の反復では、leftchildは少なくとも2倍になります(子もそうなります)。これはあなたの意図ではないようです。ループのイテレータにi = childを設定しているため、leftchildが2倍になります。

内側のforループを再検討する必要があります。たとえば、テスト式ではleftchild < sizeがテストされますが、iに基づいてすぐにleftchildを再計算し、そのテストを無効にします。

+0

ありがとう、あなたが言及したアプローチとして解決された問題! –

関連する問題