C++ std::stable_sort vs std::sort

C++ std::stable_sort vs std::sort,c++,string,sorting,stl,stable-sort,C++,String,Sorting,Stl,Stable Sort,当我解决上述问题时,我遇到了这样一种情况,std::sort()给了我一个运行时错误,但是用std::stable\u sort()替换它,就没有运行时错误了。为什么? 行用右侧的箭头符号高亮显示 代码: 类解决方案{ 公众: 字符串反转(字符串str) { int n=str.length(); 对于(int i=0;is2_temp; } 字符串最大数(向量和nums) { 字符串str=“”; 矢量inp; 对于(int i=0;i这实际上是一个非常有趣的错误!我没有测试这是否是leetc

当我解决上述问题时,我遇到了这样一种情况,
std::sort()
给了我一个运行时错误,但是用
std::stable\u sort()
替换它,就没有运行时错误了。为什么?

行用右侧的箭头符号高亮显示

代码:

类解决方案{
公众:
字符串反转(字符串str)
{
int n=str.length();
对于(int i=0;is2_temp;
}
字符串最大数(向量和nums)
{
字符串str=“”;
矢量inp;

对于(int i=0;i这实际上是一个非常有趣的错误!我没有测试这是否是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保留具有等效值的元素的相对顺序”(即)这一事实有关

与此相关的代码行在这里

if(flag==true && s1.length()==s2.length())
{
    return s1==s2;
}
事实上,如果我们把它改成

if(flag==true && s1.length()==s2.length())
{
    return s1!=s2;
}
这不会影响结果,因为如果此时,
flag==true
并且两个字符串具有相同的长度,那么它们都是等效的,并且交换字符串位置不会影响结果

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

p、 我将把谜题的各个部分留在这里,但是如果有更有经验的人(或者当我找到更多的时间)想进一步研究这个神秘的记忆问题,那就太好了


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

常规排序的错误是什么?为什么需要自定义比较函数?不能完全离开
comp
吗?请显示一个。**以下是运行时错误**:第431行:Char 55:运行时错误:带基0xBEBEBEBEBE的指针索引表达式溢出到0x7D7D7D7D7D7D7C(basic_string.h)您的代码不完整。
main
在哪里?您的
#include
s在哪里?是的,这就是答案。
std::sort
要求比较器满足某些条件。具体来说,它必须是严格弱排序,并且必须满足
comp(a,a)==false
。换句话说,元素不能将true与自身进行比较。OP的函数不能满足此要求(
comp(“0”,“0”)
返回true)。您的修复程序会将其翻转,使比较器符合要求。
if(flag==true && s1.length()==s2.length())
{
    return s1!=s2;
}