gpt4 book ai didi

c++ - 为什么我会从此合并排序中收到堆栈溢出错误? (C++)

转载 作者:行者123 更新时间:2023-11-28 03:21:04 27 4
gpt4 key购买 nike

我正在尝试使用合并排序对已转换为无符号长整型的 IP 地址列表进行排序。该 vector 包含 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 上。有关详细信息,请参阅此线程:

When vectors are allocated, do they use memory on the heap or the stack?

关于c++ - 为什么我会从此合并排序中收到堆栈溢出错误? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15424228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com