向量下标超出范围 C++ 合并排序

Posted

技术标签:

【中文标题】向量下标超出范围 C++ 合并排序【英文标题】:Vector subscript out of range C++ merge sort 【发布时间】:2018-03-10 12:56:36 【问题描述】:

我正在尝试在 c++ 中实现一个简单的合并排序,但我一直遇到这个错误:

我的代码:

void merge(vector<int> &data,int left,int mid,int right) 
vector<int> L, R, v;
int i, j;
for (i = 0; i <  mid - left + 1; i++) 
    L.push_back(v[left + i]);

for (j = 0; j < right - mid; j++) 
    R.push_back(v[mid + j + 1]);

i = j = 0;
int k = left;
while (i < L.size() && j < R.size()) 
    if (L[i] < R[j]) 
        v[k++] = L[i++];
    
    else 
        v[k++] = R[j++];
    


while (i < L.size()) 
    v[k++] = L[i++];

while (j < R.size()) 
    v[k++] = R[j++];


vector<int>::const_iterator iter = v.begin();

for (; iter != v.end(); ++iter)

    data[left++] = *iter;



void mergeSort(vector<int> &v, int left, int right) 
if (left < right) 
    int mid = (left + right) / 2;
    mergeSort(v, left, mid);
    mergeSort(v, mid + 1, right);
    merge(v, left, mid, right);


在 main 中调用:mergeSort(numbers,0,numbers.size());,其中 numbers 是带有一些数字的向量。

如何解决这个断言失败,向量下标超出范围是什么意思?

【问题讨论】:

那是一个崩溃。您使用调试器来找出它在代码中发生的位置,并检查涉及的变量以确保它们看起来正常。所以先按“重试”按钮调试进入调试器。 也就是说,消息“向量下标超出范围”应该是对正在发生的事情的一个很大的暗示。 debugging your code. @Raul Marinau 错误的原因是函数合并的代码非常糟糕。糟糕的代码包含错误是编程规则。 @Raul Marinau 至少函数合并中有错别字。循环中必须有向量数据,而不是向量 v。 for (i = 0; i 【参考方案1】:

糟糕的代码包含错误是编程法则。:)

对于初学者,您应该使用类型 std::vector&lt;int&gt;::size_type 而不是类型 int

函数merge中有错别字。很明显,在循环中必须使用向量 data 而不是向量 v,因为向量 v 是空的。

void merge(vector<int> &data,int left,int mid,int right) 
vector<int> L, R, v;
int i, j;
for (i = 0; i <  mid - left + 1; i++) 
    L.push_back(v[left + i]);

for (j = 0; j < right - mid; j++) 
    R.push_back(v[mid + j + 1]);

在循环之后,向量元素的数量也比实际的元素数量大一。

考虑以下使用来自函数 merge 的循环的测试程序。

#include <iostream>
#include <vector>

void merge( std::vector<int> &data,  
            std::vector<int>::size_type left,
            std::vector<int>::size_type mid,
            std::vector<int>::size_type right ) 

    std::vector<int> L, R;

    for ( std::vector<int>::size_type i = 0; i <  mid - left + 1; i++ ) 
    
            L.push_back( data[left + i] );
    

    for ( std::vector<int>::size_type j = 0; j < right - mid; j++ ) 
    
            R.push_back( data[mid + j + 1]);
    

    std::cout << L.size() << '\t' << R.size() << std::endl;


void mergeSort( std::vector<int> &v, 
                std::vector<int>::size_type left, 
                std::vector<int>::size_type right ) 

    if ( left < right ) 
    
        auto mid = ( left + right ) / 2;
        merge( v, left, mid, right );
    


int main() 

    std::vector<int> v(  1, 2  );

    mergeSort( v, 0, v.size() );

    return 0;

它的输出是

2   1

虽然原始向量 v 仅包含 2 元素。

【讨论】:

以上是关于向量下标超出范围 C++ 合并排序的主要内容,如果未能解决你的问题,请参考以下文章

c++和opencv中的向量下标超出范围错误

向量下标超出范围opencv c++

二维向量下标超出范围

向量下标超出范围错误 - C++ Vectors & Open CV

调试断言失败,向量下标超出范围

向量下标超出范围,错误仅在调试模式下显示