2011-10-22 44 views
4
#include <algorithm> 

bool comparisonFunc(char* c1, char* c2) 
{ 
    return strcmp(c1, c2) ? 0 : 1; 
} 

vector<char*> myVec; 
vector<char*>::iterator itr; 
sort(myVec.begin(), myVec.end(), comparisonFunc) 

這是正確的還是有更好的方法來做到這一點?如何排序矢量<char*>?

+1

'itr'似乎未被使用。和'strcmp(...)? 0:1'會更習慣性地寫成'!strcmp(...)'。但我不知道你的實際問題的答案。 – zwol

+0

@ user1002288爲什麼不使用'std :: sort(myVec.begin(),myVec.end(),:: strcmp);'directlt? –

回答

11

std::sort需要一個「小於」謂詞。你應該實現你comparisonFunc()這樣的:

bool comparisonFunc(const char *c1, const char *c2) 
{ 
    return strcmp(c1, c2) < 0; 
} 

(注意const秒;他們是非常重要的。)

您當前的執行不可能工作,因爲你剛剛返回,如果這兩個值相等或不。這些信息不足以進行排序 - 您需要知道哪一個較小,哪一個更大(當然,除非值相等)。

+0

爲什麼const在這裏很重要? – user1002288

+0

std :: sort當它只想知道哪一個更小時,絕不會讓你修改容器的內容。 – hrnt

+0

bool compareFunc(const char * c1,const char * c2)const {}? – user1002288

-1

我更多的時候想指針的矢量排序,以比只是普通的C字符串記錄...

template<> 
    struct std::less<const foo*> 
    { 
     bool operator()(const foo* lhs, const foo* rhs) const 
     { 
      return strcmp(lhs->key, rhs->key); 
     } 
    }; 

這重新定義富的比較*使得默認的比較中的排序工作。對我而言,這種風格感覺更具說明性,另一種更具程序性。如果您需要多個訂單,則默認情況下的使用是有問題的;如果你想確保所有有序的foo *集合都是相同的順序,那就很好。

std::vector<foo*> db; 
std::sort(db.begin(), db.end()); 
+0

難道你不是指'返回strcmp(...)<0;'? –

+0

IMO,這是相當有問題的。你使'foo_p1 ()(foo_p1,foo_p2)'的行爲不同,另外後者的結果與'std :: less ()(foo_p1,foo_p2)'不同。 – UncleBens

+0

......並且標準甚至似乎沒有建議排序算法默認使用std :: less。你的片段充滿了錯誤,在一天結束時根本不需要工作。 – UncleBens