2013-02-01 52 views
0

这是我的归并功能,我不明白为什么会出现总是“矢量下标越界”在VC错误++速成2010合并功能,“向量下标越界”

vector<int> Ordinatore::doMerge(vector<int> &v1, vector<int> &v2) { 
int dimV1 = v1.size(); 
int dimV2 = v2.size(); 

int dimTotale = dimV1 + dimV2; 
vector<int> merged; 

int lh, rh; 
lh=0;rh=0; 


while(lh < dimV1) { 


    if (rh < dimV2 && v1[lh] <= v2[rh]) { 

     merged.push_back(v1[lh]); 

     lh++; 
     /* the trouble should start here as far as I've seen with cout & debugging */ 
     while (rh < dimV2 && v2[rh] <= v1[lh]) { 

      merged.push_back(v2[rh]); 

      rh++; 

     } 

    } 
    else { 

     while (rh < dimV2 && v2[rh] <= v1[lh]) { 
      merged.push_back(v2[rh]); 
      rh++; 
     } 
     merged.push_back(v1[lh]); 

     lh++; 

    } 
} 

return merged; 
} 
+0

哪一行给出错误? –

+0

请注意,在你的'else'子句中,while循环将永远不会被执行,因为它的条件保证是错误的。 –

回答

0

问题是在循环的顶部:

while(lh < dimV1) { 
    if (rh < dimV2 && v1[lh] <= v2[rh]) { 
     merged.push_back(v1[lh]); 
     lh++;          // |<-- Problem 
     while (rh < dimV2 && v2[rh] <= v1[lh]) { // | 
      ... 
     } 
    } 
    else { 
     ... 
     lh++; 
    } 
} 

elselh++执行,lh递增和while(lh < dimV1)重新启动。让我们假设它是由它一路lh == dimV1 - 1 ...

  • 如果if条件计算为truelh++执行权被你标记为“的麻烦应该从这里开始”。
  • 下一行while (rh < dimV2 && v2[rh] <= v1[lh])将导致崩溃,因为lh现在等于dimV1,但您正在使用它来索引v1

您可以在此Wikipedia Article中查看更多关于合并排序的信息。