为什么我从这个归并排序中得到堆栈溢出错误?(c++)

Why am I getting a stack overflow error from this merge sort? (C++)

本文关键字:错误 栈溢出 堆栈 c++ 归并排序 为什么      更新时间:2023-10-16

我正试图使用合并排序来排序已转换为无符号长时间的IP地址列表。这个向量包含18647个数字,如果这有区别的话。我以前用c#做过归并排序,但这是我第一次用c++尝试,所以我不知道是否有一些简单的东西我错过了。下面是我现在的代码:

vector<unsigned long> Sorter::mergeSort( vector<unsigned long> v){
    if( v.size() <= 1 ){
        return v;
    }
    vector<unsigned long> left, right;
    int mid = v.size() / 2;
    for( int i = 0; i < mid; i++ ){
        left.push_back( v[i] );
    }
    for( unsigned int j = mid; j <= v.size(); j++ ){
        right.push_back( v[j] );
    }
    left = Sorter::mergeSort( left );
    right = Sorter::mergeSort( right );
    return Sorter::merge( left, right );
}
vector<unsigned long> Sorter::merge( vector<unsigned long> left, vector<unsigned long> right){
    vector<unsigned long> result;
    while( left.size() > 0 || right.size() > 0 ){
        if( left.size() > 0 && right.size() > 0 ){
            if( left[0] <= right[0] ){
                result.push_back( left[0] );
                left.erase( left.begin() );
            }else{
                result.push_back( right[0] );
                right.erase( right.begin() );
            }
        }else if( left.size() > 0 ){
            result.push_back( left[0] );
            left.erase( left.begin() );
        }else if( right.size() > 0 ){
            result.push_back( right[0] );
            right.erase( right.begin() );
        }
    }
    return result;
}
for( unsigned int j = mid; j <= v.size(); j++ )
                             ^^

你应该使用j <V.size()或j><= V.size() -1(数组索引从0开始),否则会出现索引超出边界错误。

同时,为了节省一些开销,最好采用引用方式传递vector。

另一点,由于您使用了vector,所以可以使用18647个数字,因为vector头的内存空间是在Stack上分配的,而vector的元素是在free store上分配的。

当分配向量时,它们使用堆上的内存还是堆栈上的内存?