简体   繁体   English

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

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

I'm trying to use a merge sort to sort a list of IP address that have been converted to unsigned longs. 我正在尝试使用合并排序来对已转换为无符号长整数的IP地址列表进行排序。 The vector contains 18647 numbers if that makes a difference or not. 该向量包含18647个数字,如果这有所不同。 I've done a merge sort using C# before but this is the first time I've tried it in C++ so I don't know if there's something simple I'm missing. 我之前使用C#进行了合并排序,但这是我第一次在C ++中尝试它,所以我不知道是否有一些简单的我缺少。 Here's the code I have at the moment: 这是我目前的代码:

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++ )
                             ^^

You should use j < v.size() or j <= v.size() -1 (array index starts from 0), otherwise, you have index out of bound error. 您应该使用j <v.size()或j <= v.size()-1(数组索引从0开始),否则,您有索引超出范围的错误。

Meanwhile, it is better to pass the vector by reference to save some cost. 同时,最好通过引用传递向量以节省一些成本。

Another point, since you used vector, it is OK to have 18647 numbers since memory space of the vector header is allocated on Stack but elements of vector are allocated on free store. 另一点,因为你使用了vector,所以可以有18647个数字,因为向量头的内存空间是在Stack上分配的,但是vector的元素是在free store上分配的。 See this thread for more information: 请参阅本主题以获取更多信息:

When vectors are allocated, do they use memory on the heap or the stack? 分配向量时,它们是在堆还是堆栈上使用内存?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM