gpt4 book ai didi

c++ - 自定义排序的工作方式出乎意料

转载 作者:行者123 更新时间:2023-12-02 09:49:28 31 4
gpt4 key购买 nike

在以下自定义比较中,我得到了一些我的 vector 元素意外的结果。

int dateCompare(string d1,string d2)
{
int rc;
const char *d3 = d1.c_str();
const char *d4 = d2.c_str();

// compare years
rc = strncmp(d3 + 6, d4 + 6, 4);
if (rc != 0)
return rc;

// compare months
rc = strncmp(d3 + 3, d4 + 3, 2);
if (rc != 0)
return rc;

// compare days
return strncmp(d3, d4, 2);
}


vec.push_back("01/10/2015");
vec.push_back("02/11/2015");
vec.push_back("03/09/2015");
sort(vec.begin(), vec.end(), dateCompare);

Input:
01/10/2015
02/11/2015
03/09/2015

Output:
03/09/2015
02/11/2015
01/10/2015

我知道还有其他更好的方法可以比较日期并更改元素本身的结构等。但是,除此以外,我还想弄清楚 std::sort函数的工作方式为何存在歧义,即为什么无论是否进行交换都可以互换比较器返回 truefalse
这3个元素两次调用 dateCompare()

第一次=> dateCompare("02/11/2015","01/10/2015")被调用,在对 strcmp(11,10)求值期间,返回 true ,因此存在交换。所以vec从
{"01/10/2015","02/11/2015","03/09/2015"} to  {"02/11/2015","01/10/2015","03/09/2015"}

第二次-> dateCompare("03/09/2015","02/11/2015")被调用,在对 strcmp(09,11)求值期间,返回 false ,虽然未期望进行交换,但仍被交换。所以vec从
{"02/11/2015","01/10/2015","03/09/2015"} to {"03/09/2015","01/10/2015","02/11/2015"}

所以我更改了输入( 03/09/2015更改为 03/12/2015),以便第二个比较返回true(而不是false),但它仍然会交换结果:
01/10/2015
02/11/2015
03/12/2015


03/12/2015
02/11/2015
01/10/2015

无论返回的是 true还是 false,它看起来都可以交换

最佳答案

std::sort期望比较器返回一个 bool(boolean) 值-如果第一个参数应按排序顺序位于第二个参数之前,则为true,否则为false。像您一样返回-1、0或1(小于,等于,大于)的比较器不适合std::sort;它违反了严格的弱排序要求。您的程序表现出未定义的行为。

关于c++ - 自定义排序的工作方式出乎意料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61427695/

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