std::stable_sort vs std::sort

std::stable_sort vs std::sort

本文关键字:sort std vs stable      更新时间:2023-10-16

https://leetcode.com/problems/largest-number/

当我解决上述问题时,我遇到了std::sort()给我运行时错误的情况,但用std::stable_sort()替换它,然后就没有运行时错误。为什么?

行突出显示,右侧带有箭头符号

法典:

class Solution {
public:
string reverse(string str)
{
int n=str.length();
for(int i=0;i<n/2;i++)
{
swap(str[i],str[n-i-1]);
}
return str;
}
static bool comp(string s1,string s2)
{
int min_val=min(s1.length(),s2.length());
int i=0;
bool flag=false;
for(;i<min_val;i++)
{
if((s1[i]-'0')==(s2[i]-'0'))
{
flag=true;
continue;
}
return (s1[i]-'0')>(s2[i]-'0');
}
if(flag==true && s1.length()==s2.length())
{
return s1==s2;
}
string s1_temp=s1;
string s2_temp=s2;
s1_temp+=s2;
s2_temp+=s1;
return s1_temp>s2_temp;
}
string largestNumber(vector<int>& nums)
{
string str="";
vector<string> inp;
for(int i=0;i<nums.size();i++)
{
string temp="";
long long int num=nums[i];
if(num!=0)
{
while(num!=0)
{
temp+=((num%10)+'0');
num/=10;
}
}
else
{
temp+=(num+'0');
}
inp.push_back(reverse(temp));
}
stable_sort(inp.begin(),inp.end(),comp); // <-- This Line
string res="";
for(int i=0;i<inp.size();i++)
{
res+=inp[i];
}
cout<<"yes"<<endl;
if(res[0]=='0')
{
return "0";
}
return res;
}
};

测试用例:

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

谁能告诉我发生这种情况的原因?

这实际上是一个非常有趣的错误!我还没有测试这是否是特定于 leetcode 的问题,但是在 leetcode 上运行此代码并sort(),我们收到以下错误:

Line 431: Char 55: runtime error: pointer index expression with base 0xbebebebebebebebe overflowed to 0x7d7d7d7d7d7d7d7c (basic_string.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/basic_string.h:440:55

这似乎表明我们由于某种原因内存不足。此代码适用于stable_sort()但不适用于sort()这一事实表明,这可能与"stable_sort保留具有等效值的元素的相对顺序"这一事实有关(http://www.cplusplus.com/reference/algorithm/stable_sort/(。

与此相关的代码行在这里

if(flag==true && s1.length()==s2.length())
{
return s1==s2;
}

事实上,如果我们将其更改为

if(flag==true && s1.length()==s2.length())
{
return s1!=s2;
}

这不会影响结果,因为如果此时flag == true和两个字符串的长度相同,那么它们都是等效的,交换字符串位置不会影响结果。

但是我们绕过了错误。 @Vikram 凯斯瓦尼 我希望这能解决你的问题。就个人而言,我也只会将comp()函数中的代码替换为return s1 > s2;,该代码应提供与您拥有的代码相同的行为。

附言我将把拼图的碎片留在这里,但如果有人更有经验的人(或者当我找到更多时间时(想进一步研究这个神秘的记忆问题,那就太好了。

顺便说一下,在leetcode上重现此错误所需的最小长度输入是[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]即17 0(一个奇怪的数字(。