c++ 中带有对象的排序函数

Sort function in c++ with objects?

本文关键字:排序 函数 对象 c++      更新时间:2023-10-16

我有以下程序以小时:分钟:秒的形式比较时间。

class time
{
public:
    string Hours;
    string Minutes;
    string Seconds;
};
bool CompareTimes(time A, time B)
{
    if (A.Hours < B.Hours)
    {
        return true;
    }
    if (A.Minutes < B.Minutes)
    {
        return true;
    }
    if (A.Seconds < B.Seconds)
    {
        return true;
    }
    return false;
}

而且基本上...

sort(TimeArray, TimeArray + NumberOfTimes, CompareTimes);

但是,这似乎没有正确排序。另一方面,如果我将比较时间方法更改为以下内容:

bool CompareTimes(time A, time B)
    {
        if (A.Hours > B.Hours)
        {
            return false;
        }
        if (A.Minutes > B.Minutes)
        {
            return false;
        }
        if (A.Seconds > B.Seconds)
        {
            return false;
        }
        return true;
    }

然后一切正常。我认为如果第二个输入大于第一个输入,排序函数需要返回 true。为什么在第一种情况下不起作用,但在第二种情况下有效?

if (A.Hours < B.Hours)
{
        return true;
}

之后,您有两个选择:小时相等,或 A.小时>B.小时。如果它们相等,那么比较分钟是有意义的。如果 A 有更多的小时数,那么比较分钟是没有意义的。您的第二个条件应该是:

if (A.Hours == B.Hours && A.Minutes < B.Minutes)

同样,你的第三个条件应该是:

if (A.Hours == B.Hours && A.Minutes == B.Minute && A.Seconds < B.Seconds)

最后的回报应保持不变。另外,请注意,将它们存储为字符串将导致它们按字母顺序排序。(或按其 ASCII 码的顺序)。

我认为要返回true,您需要一次检查所有三个条件。

return (A.Hours*60*60 +A.Minutes*60+A.Seconds > B.Hours*60*60 + B.Minutes*60 + B.Seconds);

刚刚编写了如下所示的示例。

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
using namespace std;
class time_
{
public:
    string Hours;
    string Minutes;
    string Seconds;
    time_(int h,int m,int s){ 
        char buf[6]={0,};
        memset(buf,0,sizeof(buf));sprintf(buf,"%d",h);Hours+=buf;
        memset(buf,0,sizeof(buf));sprintf(buf,"%d",m);Minutes+=buf;
        memset(buf,0,sizeof(buf));sprintf(buf,"%d",s);Seconds+=buf;
    }   
};
bool CompareTimes(time_ A, time_ B){ 
    return (
        ((atoi(A.Hours.c_str())*60*60)+(atoi(A.Minutes.c_str())*60)+atoi(A.Seconds.c_str())) > 
        ((atoi(B.Hours.c_str())*60*60)+(atoi(B.Minutes.c_str())*60)+atoi(B.Seconds.c_str())));
}
int main(){
    time_ A(10,10,10);
    time_ B(10,10,11);
    std::cout<<(CompareTimes( A, B)?"greater":"smaller")<<endl;
    time_ A1(10,11,10);
    time_ B1(10,10,10);
    std::cout<<(CompareTimes( A1, B1)?"greater":"smaller")<<endl;
}