2011-12-20 71 views
0

我想跟隨某人試圖簡化C++排序參考的鏈接http://www.cplusplus.com/forum/beginner/4817/但是我不能讓bool運算符函數按照他的方式進行編譯。使用比較函數對對象的向量排序

我有事件對象的向量。我想根據事件開始時間對矢量進行排序。如果開始時間是數字,這將更容易,但它們是字符串,所以我必須編寫函數來轉換爲uint64_t,我的所有代碼直到這種嘗試都是按照它應該的方式工作的。這裏是我試圖去上班代碼:

的布爾函數:

bool EWriter:: operator() (Event &a, Event &b){ 
    return (stringToTime(stringReturnWrap(a.getBeginTime())) < stringToTime(stringReturnWrap(b.getBeginTime()))); 
} 

此代碼編譯,但我無法弄清楚如何給它一個名字,所以我不能引用它這種排序。此外,我寧願超載運算符<,但我一直得到一個錯誤,它需要第三個參數。

這裏是我的排序:

sort(events->begin(), events->end(), someFunctionName);?? 

略無關的是,我知道我應該在參數傳遞給使用const的,但我不能把事件類的功能,如果我讓他們實現。

+2

你忘了const'岬加上'你'活動&a'和'活動&b'? – dasblinkenlight 2011-12-20 20:45:37

+0

'Event :: getBeginTime()'應該聲明爲'const'。如果這不是你的代碼,也許你可以讓作者修復它。如果它是你的代碼,請修復它! 8v) – 2011-12-20 20:46:18

回答

2

通過重載operator(),您製作了EWriter a functor

只要通過它EWriter的一個實例。

如果EWriter有一個默認的構造函數,你可以使用:

sort(events->begin(), events->end(), EWriter()); 

或者通過它已存在的EWriter

+0

我試圖按照一個不正確的例子。我應該重載<運算符,但編譯器說我需要第三個參數來做到這一點,我不知道會是什麼。 – Miek 2011-12-21 16:04:58

0

你重載括號運算符:

bool EWriter:: operator() (Event &a, Event &b){ 
    return (stringToTime(stringReturnWrap(a.getBeginTime())) < stringToTime(stringReturnWrap(b.getBeginTime()))); 

}

與嘗試:

bool EWriter:: operator <(Event &a, Event &b){ 
    return (stringToTime(stringReturnWrap(a.getBeginTime())) < stringToTime(stringReturnWrap(b.getBeginTime()))); 

}

+0

我試過了,編譯器不斷告訴我我需要第三個參數 – Miek 2011-12-20 23:44:03

+0

被刪除的答案表示,基本上就像你只命名它的函數比較,並刪除操作符一起重載。那麼矢量排序是std :: sort(eventVentor.begin(),eventVector.end,compare)。這是有道理的,但我感到沮喪,寫了一個似乎工作的泡沫排序。謝謝您的幫助 – Miek 2011-12-20 23:49:50