2013-09-26 68 views
0

我有以下程序以小時:分鐘:秒的形式比較時間。在C++中用對象對函數進行排序?

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); 

然而,這似乎並沒有正確地排序。在另一方面,如果我改變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; 
    } 

然後一切工作正常。我認爲如果第二個輸入大於第一個輸入,sort函數需要返回true。爲什麼它在第一種情況下不起作用,但在第二種情況下工作?

+3

只需使用'std :: tie'並比較得到的元組。 – chris

+0

[運算符<和嚴格弱排序](http://stackoverflow.com/q/979759/1639256)或[如何將bool映射到具有std :: map的3d點結構?](http:/ /stackoverflow.com/q/6109445/1639256)(我更喜歡後者的接受答案) – Oktalist

回答

0

我認爲要返回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; 
} 
2
if (A.Hours < B.Hours) 
{ 
     return true; 
} 

之後,你有兩個選擇:時間是相等的,或A.hours> B.hours。如果他們是平等的,那麼比較分鐘是有意義的。如果A有更多的時間,那麼比較分鐘就沒有意義了。 你的第二個條件應該是:

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

同樣,你的第三個條件應該是:

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

最後的回報應保持不變。 另外,請注意將它們存儲爲字符串將使它們按字母順序排列。 (或按照他們的ASCII碼順序)。