为什么我从这个归并排序中得到堆栈溢出错误?(c++)
Why am I getting a stack overflow error from this merge sort? (C++)
我正试图使用合并排序来排序已转换为无符号长时间的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上分配的。
当分配向量时,它们使用堆上的内存还是堆栈上的内存?
相关文章:
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 使用 strcat 获取缓冲区溢出错误
- 如何修复此特征矩阵反演溢出错误?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 没有 climits 库的溢出错误
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 应该如何读取堆缓冲区溢出错误消息?
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 运行时错误:基0x000000000000溢出到0xffffffffffffffff的指针索引表达式 (basic_st
- 初始化数组并出现堆栈溢出错误
- 为什么 LeetCode 给出错误:地址清理器:堆缓冲区溢出
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- 将 Vector<int> 推送到 Vector<vector 时出现堆溢出错误<int>>
- 分段错误:堆栈溢出
- 堆栈空间不足错误(堆栈溢出错误)
- c++中栈溢出和分段错误的危险